C++設計模式之工廠方法模式
問題描述
之前講到了C++設計模式——簡單工廠模式,由于簡單工廠模式的局限性,比如:工廠現(xiàn)在能生產(chǎn)ProductA、ProductB和ProductC三種產(chǎn)品了,此時,需要增加生產(chǎn)ProductD產(chǎn)品;那么,首先是不是需要在產(chǎn)品枚舉類型中添加新的產(chǎn)品類型標識,然后,修改Factory類中的switch結(jié)構(gòu)代碼。是的,這種對代碼的修改,對原有代碼的改動量較大,易產(chǎn)生編碼上的錯誤(雖然很簡單,如果工程大了,出錯也是在所難免的!?。。_@種對代碼的修改是最原始,最野蠻的修改,本質(zhì)上不能稱之為對代碼的擴展。同時,由于對已經(jīng)存在的函數(shù)進行了修改,那么以前進行過的測試,都將是無效的,所有的測試,都將需要重新進行,所有的代碼都需要進行重新覆蓋。這種,增加成本,不能提高效率的事情,在公司是絕對不允許的(除非昏庸的PM)。出于種種原因,簡單工廠模式,在實際項目中使用的較少。那么該怎么辦?怎么辦呢?需要對原有代碼影響降到最小,同時能對原有功能進行擴展。
UML類圖
那么今天介紹的工廠方法模式,就隆重登場了。它只是對簡單工廠模式的擴展,在GOF的介紹中,它們是合并在一起的,而我則是單獨分開進行講解的,就是為了區(qū)分二者的利弊,便于大家在實際項目中進行更好的把握與應用。工廠方法模式是在簡單工廠模式的基礎上,對“工廠”添加了一個抽象層。將工廠共同的動作抽象出來,作為抽象類,而具體的行為由子類本身去實現(xiàn),讓子類去決定生產(chǎn)什么樣的產(chǎn)品。
如圖,F(xiàn)actoryA專心負責生產(chǎn)ProductA,F(xiàn)actoryB專心負責生產(chǎn)ProductB,F(xiàn)actoryA和FactoryB之間沒有關(guān)系;如果到了后期,如果需要生產(chǎn)ProductC時,我們則可以創(chuàng)建一個FactoryC工廠類,該類專心負責生產(chǎn)ProductC類產(chǎn)品。由于FactoryA、FactoryB和FactoryC之間沒有關(guān)系,當加入FactoryC加入時,對FactoryA和FactoryB的工作沒有產(chǎn)生任何影響,那么對代碼進行測試時,只需要單獨對FactoryC和ProductC進行單元測試,而FactoryA和FactoryB則不用進行測試,則可省去大量無趣無味的測試工作。
適用場合
工廠方法模式的意義是定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將實際創(chuàng)建工作推遲到子類當中。核心工廠類不再負責產(chǎn)品的創(chuàng)建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現(xiàn)的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進新的產(chǎn)品。
1.在設計的初期,就考慮到產(chǎn)品在后期會進行擴展的情況下,可以使用工廠方法模式;
2.產(chǎn)品結(jié)構(gòu)較復雜的情況下,可以使用工廠方法模式;
由于使用設計模式是在詳細設計時,就需要進行定奪的,所以,需要權(quán)衡多方面的因素,而不能為了使用設計模式而使用設計模式。
代碼實現(xiàn):
/* ** FileName : FactoryMethodPatternDemo ** Author : Jelly Young ** Date : 2013/11/18 ** Description : More information, please go to //www.jb51.net */ #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; }
上一篇:C++實現(xiàn)查找中位數(shù)的O(N)算法和Kmin算法
欄 目:C語言
下一篇:C++實現(xiàn)打印1到最大的n位數(shù)
本文標題:C++設計模式之工廠方法模式
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3349.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10APUE筆記之:進程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11ajax實現(xiàn)頁面的局部加載