C++设计模式之工厂方法模式
問題描述
之前講到了C++設計模式——簡單工廠模式,由于簡單工廠模式的局限性,比如:工廠現(xiàn)在能生產ProductA、ProductB和ProductC三種產品了,此時,需要增加生產ProductD產品;那么,首先是不是需要在產品枚舉類型中添加新的產品類型標識,然后,修改Factory類中的switch結構代碼。是的,這種對代碼的修改,對原有代碼的改動量較大,易產生編碼上的錯誤(雖然很簡單,如果工程大了,出錯也是在所難免的!!!)。這種對代碼的修改是最原始,最野蠻的修改,本質上不能稱之為對代碼的擴展。同時,由于對已經存在的函數(shù)進行了修改,那么以前進行過的測試,都將是無效的,所有的測試,都將需要重新進行,所有的代碼都需要進行重新覆蓋。這種,增加成本,不能提高效率的事情,在公司是絕對不允許的(除非昏庸的PM)。出于種種原因,簡單工廠模式,在實際項目中使用的較少。那么該怎么辦?怎么辦呢?需要對原有代碼影響降到最小,同時能對原有功能進行擴展。
?
FactoryA專心負責生產ProductA,FactoryB專心負責生產ProductB,FactoryA和FactoryB之間沒有關系;如果到了后期,如果需要生產ProductC時,我們則可以創(chuàng)建一個FactoryC工廠類,該類專心負責生產ProductC類產品。由于FactoryA、FactoryB和FactoryC之間沒有關系,當加入FactoryC加入時,對FactoryA和FactoryB的工作沒有產生任何影響,那么對代碼進行測試時,只需要單獨對FactoryC和ProductC進行單元測試,而FactoryA和FactoryB則不用進行測試,則可省去大量無趣無味的測試工作。
適用場合
工廠方法模式的意義是定義一個創(chuàng)建產品對象的工廠接口,將實際創(chuàng)建工作推遲到子類當中。核心工廠類不再負責產品的創(chuàng)建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現(xiàn)的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進新的產品。
由于使用設計模式是在詳細設計時,就需要進行定奪的,所以,需要權衡多方面的因素,而不能為了使用設計模式而使用設計模式。
代碼實現(xiàn)
/* ** FileName : FactoryMethodPatternDemo ** Author : Jelly Young ** Date : 2013/11/18 ** Description : More information, please go to http://www.jellythink.com */#include <iostream> using namespace std;class Product { public:virtual void Show() = 0; };class ProductA : public Product { public:void Show(){cout<< "I'm ProductA"<<endl;} };class ProductB : public Product { public:void Show(){cout<< "I'm ProductB"<<endl;} };class Factory { public:virtual Product *CreateProduct() = 0; };class FactoryA : public Factory { public:Product *CreateProduct(){return new ProductA ();} };class FactoryB : public Factory { public:Product *CreateProduct(){return new ProductB ();} };int main(int argc , char *argv []) {Factory *factoryA = new FactoryA ();Product *productA = factoryA->CreateProduct();productA->Show();Factory *factoryB = new FactoryB ();Product *productB = factoryB->CreateProduct();productB->Show();if (factoryA != NULL){delete factoryA;factoryA = NULL;}if (productA != NULL){delete productA;productA = NULL;}if (factoryB != NULL){delete factoryB;factoryB = NULL;}if (productB != NULL){delete productB;productB = NULL;}return 0; }2013年11月18日 于大連、東軟。
總結
以上是生活随笔為你收集整理的C++设计模式之工厂方法模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3_11 InterpreterMode
- 下一篇: C++设计模式之访问者模式