工厂模式主要有三种类型:
· 简单工厂
· 工厂方法
· 抽象工厂
简单工厂
#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抽象类即可