工廠方法FactoryMethod

簡單工廠的幾個缺點:

  1. 不符合對修改關閉,對擴展開發的設計原則;
  2. 如果產品過多,影響代碼美觀性;
  3. 不符合實際。

工廠方法在一定程度上解決了簡單工廠存在的弊端

  1. 每個產品都應該有自己的工廠,而不是放在一個工廠中創建;
  2. 如果需要添加產品,只需要去添加對應的產品工廠,不需要修改其他地方;
  3. 相對符合實際一些。

具體設計

//原有的驅動基類和具體的派生類
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章