C++設(shè)計模式中的工廠模式詳細介紹
1. 簡單工廠模式
簡單工廠模式(Simple Factory Pattern): 是指定義一個工廠類,工廠類中實現(xiàn)一個方法,此方法根據(jù)不同的參數(shù)返回不同的類,UML類圖如下所示:
代碼如下:
#include <iostream> using namespace std; class Product { public: ~Product() {} // 純虛函數(shù) virtual void Create(string content) = 0; }; class ProductA : public Product { public: void Create(string content) override { cout << "ProductA " << content << endl; } }; class ProductB : public Product { public: void Create(string content) override { cout << "ProductB " << content << endl; } }; class Factory { public: Product* CreateProduct(const type_info& ty_info) { if (ty_info == typeid(ProductA)) { return m_pProductA = new ProductA(); } else if (ty_info == typeid(ProductB)) { return m_pProductB = new ProductB(); } return NULL; } ~Factory(){ if(m_pProductA) delete m_pProductA; if(m_pProductB) delete m_pProductB; } private: ProductA* m_pProductA; ProductB* m_pProductB; }; int main() { Factory factory; factory.CreateProduct(typeid(ProductA))->Create("A"); factory.CreateProduct(typeid(ProductB))->Create("B"); system("pause"); }
簡單工廠模式的問題:
- 當要創(chuàng)建的實例過多時,會存在過多的if語句
- 當要創(chuàng)建新的實例時要修改工廠方法,這樣做違背了開-閉原則(即對擴展開放,對修改關(guān)閉的原則)
2. 工廠方法模式
工廠方法模式(Factory Method Pattern): 是在簡單工廠模式的基礎(chǔ)上將工廠類修改為抽象類,具體的類實例創(chuàng)建交給抽象工廠的子類。UML類圖如所示:
代碼如下所示:
#include <iostream> using namespace std; class Product { public: ~Product() {} // 純虛函數(shù) virtual void Create(string content) = 0; }; class ProductA : public Product { public: void Create(string content) override { cout << "ProductA " << content << endl; } }; class ProductB : public Product { public: void Create(string content) override { cout << "ProductB " << content << endl; } }; class Factory { public: virtual Product* CreateProduct() = 0; Product* m_pProduct; virtual ~Factory() { if (m_pProduct) delete m_pProduct; } }; class FactoryA : public Factory { public: virtual Product* CreateProduct() override{ return m_pProduct = new ProductA(); } }; class FactoryB : public Factory { public: virtual Product* CreateProduct() override { return m_pProduct = new ProductB(); } }; int main() { FactoryA factroyA; FactoryB factroyB; factroyA.CreateProduct()->Create("A"); factroyB.CreateProduct()->Create("B"); system("pause"); }
工廠方法模式很好的避免了過多的if語句,同時也保證了開-閉原則,但是當類過多時會產(chǎn)生類"爆炸"的情況,所以具體選用什么模式需要根據(jù)實際需求進行取舍。
3. 抽象工廠模式
抽象工廠與工廠方法相比,抽象工廠允許生成不同的產(chǎn)品(即一個工廠存在多個產(chǎn)品)。代碼如下所示:
```cpp #include <iostream> using namespace std; class Product { public: ~Product() {} // 純虛函數(shù) virtual void Create(string content) = 0; }; class ProductA : public Product { public: void Create(string content) override { cout << "ProductA " << content << endl; } }; class ProductB : public Product { public: void Create(string content) override { cout << "ProductB " << content << endl; } }; class Factory { public: virtual Product* CreateProductA() = 0; virtual Product* CreateProductB() = 0; Product* m_pProductA; Product* m_pProductB; virtual ~Factory() { if (m_pProductA) delete m_pProduct; if(m_pProductB) delete m_pProductB; } }; class FactorySubOne : public Factory { public: virtual Product* CreateProductA() override{ return m_pProductA = new ProductA(); } virtual Product* CreateProductB() override { return m_pProductB = new ProductB(); } }; class FactorySubTwo : public Factory { public: virtual Product* CreateProductA() override{ return m_pProductA = new ProductA(); } virtual Product* CreateProductB() override { return m_pProductB = new ProductB(); } }; int main() { FactorySubOne factroy_sub_one; FactorySubTwo factroy_sub_two; factroy_sub_one.CreateProductA()->Create("FactorySubOne A"); factroy_sub_one.CreateProductB()->Create("FactorySubOne B"); factroy_sub_two.CreateProductA()->Create("FactorySubTwo A"); factroy_sub_two.CreateProductB()->Create("FactorySubTwo B"); system("pause"); }
到此這篇關(guān)于C++設(shè)計模式中的工廠模式詳細介紹的文章就介紹到這了,更多相關(guān)C++工廠模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++課程設(shè)計之學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細介紹了C++課程設(shè)計之學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-12-12c++ Protobuf解決數(shù)據(jù)傳輸瓶頸面試精講
這篇文章主要介紹了c++ Protobuf解決數(shù)據(jù)傳輸瓶頸利器面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10QT連接Mysql數(shù)據(jù)庫的實現(xiàn)步驟
本文主要介紹了QT連接Mysql數(shù)據(jù)庫的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2022-06-06C語言浮點型數(shù)據(jù)在內(nèi)存中的存儲方式詳解
任何數(shù)據(jù)在內(nèi)存中都是以二進制的形式存儲的,例如一個short型數(shù)據(jù)1156,其二進制表示形式為00000100 10000100,下面這篇文章主要給大家介紹了關(guān)于C語言浮點型數(shù)據(jù)在內(nèi)存中的存儲方式,需要的朋友可以參考下2023-03-03C++ 基礎(chǔ)編程之十進制轉(zhuǎn)換為任意進制及操作符重載
這篇文章主要介紹了C++ 基礎(chǔ)編程之十進制轉(zhuǎn)換為任意進制及操作符重載的相關(guān)資料,需要的朋友可以參考下2017-02-02C語言中字符型數(shù)據(jù)和浮點型數(shù)據(jù)介紹
大家好,本篇文章主要講的是C語言中字符型數(shù)據(jù)和浮點型數(shù)據(jù)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型
虛擬函數(shù)(Visual Function)亦常被成為虛函數(shù),是C++中的一個重要特性,本文我們就來解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型2016-06-06