工厂模式的使用情景
1、客户类不关心使用哪个具体类,只关心该接口所提供的功能
2、创建过程比较复杂,比如需要初始化其他关联的资源类,服务配置文件等
3、接口有很多具体实现或抽象类有很多具体子类时,你可能需要为客户代码写一大串if-else
逻辑来决定运行时使用哪个具体实现或者具体子类
4、不希望给客户程序暴露过多此类的内部结构,隐藏这些细节可以降低耦合度。
5、优化性能,比如缓存大对象或者初始或比较耗时的对象
工厂模式属于创建型模式,大致可分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。
简单工厂模式:在工厂类中做判断,从而创造响应的产品。
简单工厂模式UML图
enmu CTYPE {COREA, COREB};//枚举
class SingleCore{
public:
virtual void Show() = 0;//纯虚函数
};
class SingleCoreA: public SingleCore{
public:
void show(){ cout << "SingleCore A" << endl; }
};
class SingleCoreB: public SingleCore{
public:
void Show(){ cout << "SingleCore B" << endl; }
};
class Factory{
public:
SingleCore* CreateSingleCore(enum CTYPE ctype){
if(ctype == COREA)
return new SingleCoreA();//生产核A
else if(ctype == COREB)
return new SingleCoreB();//生产核B
else
return NULL
}
};
工厂方法模式:指定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法模式UML图
class SingleCore{
public:
virtual void Show() = 0;//纯虚函数
};
class SingleCoreA: public SingleCore{
public:
void show(){ cout << "SingleCore A" << endl; }
};
class SingleCoreB: public SingleCore{
public:
void Show(){ cout << "SingleCore B" << endl; }
};
class Factory{
public:
virtual SingleCore* CreateSingleCore() = 0;
};
//生产A核的工厂
class FactoryA{
public:
SingleCoreA* CreateSingleCore(){ return new SingleCoreA; }
};
//生产B核的工厂
class FactoryB{
public:
SingleCoreB* CreateSingleCore(){ return new SingleCoreB; }
};
抽象工厂模式:工厂A只生产A型号的产品。。。。。
抽象工厂模式UML图
class SingleCore{
public:
virtual void Show() = 0;//纯虚函数
};
class SingleCoreA: public SingleCore{
public:
void show(){ cout << "SingleCore A" << endl; }
};
class SingleCoreB: public SingleCore{
public:
void Show(){ cout << "SingleCore B" << endl; }
};
class MultiCore{
public:
virtual void Show() = 0;
};
class MultiCoreA: public MultiCore{
public:
void Show(){ cout << "MultiCore A" << endl; }
};
class MultiCoreB: public MultiCore{
public:
void Show(){ cout << "MultiCore B" << endl; }
};
class Factory{
public:
virtual SingleCore* CreateSingleCore() = 0;
virtual MultiCore* CreateMultiCore() = 0;
};
//工厂A,专门用来生产A型号的处理器
class FactoryA{
public:
SingleCoreA* CreateSingleCore(){ return new SingleCoreA; }
MultiCoreA* CreateMultiCore(){ return new MultiCoreA; }
};
//工厂B,专门用来生产B型号的处理器
class FactoryB{
public:
SingleCoreB* CreateSingleCore(){ return new SingleCoreB; }
MultiCoreB* CreateMultiCore(){ return new MultiCoreB; }
};