1. 程式人生 > >【C++設計模式一】C++簡單工廠模式

【C++設計模式一】C++簡單工廠模式

#(1)定義 定義一個簡單工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。 #(2)結構 簡單工廠模式有以下的結構: * 工廠(Factory):根據客戶提供的具體產品類的引數,建立具體產品例項; * 抽象產品(AbstractProduct):具體產品類的基類,包含建立產品的公共方法; * 具體產品(ConcreteProduct):抽象產品的派生類,包含具體產品特有的實現方法,是簡單工廠模式的建立目標。 #(3)例項 SimpleFactory.h ```cpp #ifndef SIMPLEFACTORY_H #define SIMPLEFACTORY_H #include #include //抽象產品類AbstractProduct(並非真正意義上的抽象類,含有純虛擬函式才是抽象類) class AbstractSportProduct { public: AbstractSportProduct(){} ~AbstractSportProduct(){} //虛擬函式 virtual void printName(){} virtual void play(){} }; //具體產品類Basketball class Basketball :public AbstractSportProduct { public: Basketball(){} ~Basketball(){} //具體實現方法 void printName(); void play(); }; //具體產品類Football class Football :public AbstractSportProduct { public: Football(){} ~Football(){} //具體實現方法 void printName(); void play(); }; //工廠類 class Factory { public: Factory(){} ~Factory(){} AbstractSportProduct *getSportProduct(std::string productName); }; #endif // TSIMPLEFACTORY_H ``` SimpleFactory.cpp ```cpp #include "SimpleFactory.h" //Basketball方法 void Basketball::printName(){ printf("Basketball\n"); } void Basketball::play(){ printf("play Basketball\n"); } //Football方法 void Football::printName(){ printf("Football\n"); } void Football::play(){ printf("play Football\n"); } //工廠方法 AbstractSportProduct *Factory::getSportProduct(std::string productName) { AbstractSportProduct *pro = NULL; if (productName == "Basketball") { pro = new Basketball(); } else if (productName == "Football") { pro = new Football(); } return pro; } ``` main.cpp ```cpp #include "SimpleFactory.h" int _tmain(int argc, _TCHAR* argv[]) { Factory *fac = new Factory(); AbstractSportProduct *product = NULL; product = fac->getSportProduct("Basketball"); product->printName(); product->play(); product = fac->getSportProduct("Football"); product->printName(); product->play(); return 0; } ``` 輸出結果: ![](https://img2020.cnblogs.com/blog/2085020/202010/2085020-20201015104952991-821438515.png) #(3)總結 優點: * 工廠類提供建立具體產品的方法,幷包含一定判斷邏輯,客戶不必參與產品的建立過程; * 客戶只需要知道對應產品的引數即可,引數一般簡單好記,如數字、字元或者字串等。 缺點: * 在擴充套件功能時,需要增加具體的產品類和修改工廠類,所以違背了開閉原則(對擴充套件開放,對修改關