简单工厂的几个缺点:
- 不符合对修改关闭,对扩展开发的设计原则;
- 如果产品过多,影响代码美观性;
- 不符合实际。
工厂方法在一定程度上解决了简单工厂存在的弊端:
- 每个产品都应该有自己的工厂,而不是放在一个工厂中创建;
- 如果需要添加产品,只需要去添加对应的产品工厂,不需要修改其他地方;
- 相对符合实际一些。
具体设计:
//原有的驱动基类和具体的派生类
class Device{
public:
Device(std::string name):name_(name){}
virtual void show() = 0;
protected:
std::string name_;
};
class Srr :public Device{
public:
Srr(std::string name):Device(name){}
void show(){
std::cout << "Get a Srr device name:" << name_ << std::endl;
}
};
class Esr :public Device{
public:
Esr(std::string name) :Device(name){}
void show(){
std::cout << "Get a Esr device name:" << name_ << std::endl;
}
};
每个驱动都应该有自己的生产工厂:
//工厂基类
class Factory{
public:
virtual Device *GetDevice(std::string name) = 0;
};
//具体工厂
class SrrFactory :public Factory{
public:
Device *GetDevice(std::string name){
return new Srr(name);
}
};
class EsrFactory :public Factory{
public:
Device *GetDevice(std::string name){
return new Esr(name);
}
};
使用需要创建产品对应的工厂实例,通过该实例得到产品实例:
void main(void){
//分别获取对应的产品工厂实例
Factory *srrfactory = new SrrFactory();
Factory *esrfactory = new EsrFactory();
//通过各自工厂生产所对应的产品
Device * srr= srrfactory->GetDevice("srr4");
Device * esr = esrfactory->GetDevice("esr3");
//使用对象
srr->show();
esr->show();
delete srr;
delete esr;
delete esrfactory;
delete srrfactory;
}