设计模式学习(二):工厂模式

工厂模式主要有三种类型:
· 简单工厂
· 工厂方法
· 抽象工厂

简单工厂

#include <iostream>
using namespace std;

class Image{ //抽象基类,创建图片
public:
    virtual void show() = 0;
};

class BitImage:public Image{ //具体为bitmap格式的图片
public:
    virtual void show(){ cout<<"bitImage show"<<endl;}
};

class PngImage:public Image{//具体为png格式的图片
public:
    virtual void show(){ cout<<"PngImage show"<<endl;}
};

enum CYPE{
    BITIMAGE,
    PNGIMAGE,
};

class Factory{ //通过个管理类,来得到想要的类
public:
    Image * createImage(enum CTYPE ct){
        if (ct == BITIMAGE){
            return new BitImage();
        } else if (ct == PNGIMAGE) {
            return new PngImage();
        } else {
            return NULL;
        }
    }

};

使用方法

int main() {
    Factory fac;
    Image * bt = fac.createImage( (CTYPE) BITIMAGE);
    bt->show();  
    return 1;
}

结果

bitImage show

分析

如果又增加了其他类型的图片,如果要得到这种类型的图片,需要修改管理类Factory,但在软件设计中,最好的维护方式是增加代码,而不是修改代码。所以就出现了工厂方法

工厂方法

#include <iostream>
using namespace std;

class Image{ //抽象基类,创建图片
public:
    virtual void show() = 0;
};

class BitImage:public Image{ //具体为bitmap格式的图片
public:
    virtual void show(){ cout<<"bitImage show"<<endl;}
};

class PngImage:public Image{//具体为png格式的图片
public:
    virtual void show(){ cout<<"PngImage show"<<endl;}
};


class MethodFactory{ //通过个管理类,来得到想要的类
public:
    virtual Image * createImage() = 0;

};

class BitFactory{
public:
    virtual Image * createImage() {
        return new BitImage();
    }
};

class PngFactory{
public:
    virtual Image * createImage() {
        return new PngImage();
    }
};

使用方法

int main() {
PngFactory fac;
Image * bt = fac.createImage();
bt->show();
return 1;
}

结果

PngImage show

分析

在增加了其他类型的图片,同时也需要增加相应的factory类

抽象工厂

我如果在增加一个抽象类Video,来生产另一系列的产品时,就需要用到抽象工厂

#include <iostream>
using namespace std;

class Image{ //抽象基类,创建图片
public:
    virtual void show() = 0;
};

class BitImage:public Image{ //具体为bitmap格式的图片
public:
    virtual void show(){ cout<<"bitImage show"<<endl;}
};

class PngImage:public Image{//具体为png格式的图片
public:
    virtual void show(){ cout<<"PngImage show"<<endl;}
};

class Video{
public:
    virtual void show() = 0;
};

class Mp4Video:public Video{
public:
    virtual void show(){cout<<"Mp4Video show"<<endl;}
};

class AviVideo:public Video{
public:
    virtual void show(){cout<<"AviVideo show"<<endl;}
};

class absFactory{ //通过个管理类,来得到想要的类
public:
    virtual Image * createImage() = 0;
    virtual Video * createVideo() = 0;

};

class FactoryImpl{
public:
    virtual Image * createImage() {
        return new BitImage();
    }
    virtual Video * createVideo() {
        return new Mp4Video();
    }
};

使用

int main() {
FactoryImpl fac;
Video * bt = fac.createVideo();
bt->show();
return 1;
}

结果

Mp4Video show

分析

如果想得到剩余类型的产品时,再实现absFactory抽象类即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值