簡單工廠的幾個缺點:
- 不符合對修改關閉,對擴展開發的設計原則;
- 如果產品過多,影響代碼美觀性;
- 不符合實際。
工廠方法在一定程度上解決了簡單工廠存在的弊端:
- 每個產品都應該有自己的工廠,而不是放在一個工廠中創建;
- 如果需要添加產品,只需要去添加對應的產品工廠,不需要修改其他地方;
- 相對符合實際一些。
具體設計:
//原有的驅動基類和具體的派生類
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;
}