舉例解析設(shè)計(jì)模式中的工廠方法模式在C++編程中的運(yùn)用
工廠方法模式不同于簡(jiǎn)單工廠模式的地方在于工廠方法模式把對(duì)象的創(chuàng)建過程放到里子類里。這樣工廠父對(duì)象和產(chǎn)品父對(duì)象一樣,可以是抽象類或者接口,只定義相應(yīng)的規(guī)范或操作,不涉及具體的創(chuàng)建或?qū)崿F(xiàn)細(xì)節(jié)。
其類圖如下:
實(shí)例代碼為:
#pragma once class IProduct { public: IProduct(void); virtual ~IProduct(void); }; #pragma once #include "iproduct.h" class IPad : public IProduct { public: IPad(void); ~IPad(void); }; #pragma once #include "iproduct.h" class IPhone : public IProduct { public: IPhone(void); ~IPhone(void); }; #pragma once #include"IProduct.h" class IFactory { public: IFactory(void); virtual ~IFactory(void); virtual IProduct* getProduct(); }; #pragma once #include "ifactory.h" class IPadFactory : public IFactory { public: IPadFactory(void); ~IPadFactory(void); virtual IProduct* getProduct(); }; #pragma once #include "ifactory.h" class IPhoneFactory : public IFactory { public: IPhoneFactory(void); ~IPhoneFactory(void); virtual IProduct* getProduct(); };
關(guān)鍵的實(shí)現(xiàn):
#include "StdAfx.h" #include "IPadFactory.h" #include"IPad.h" IPadFactory::IPadFactory(void) { } IPadFactory::~IPadFactory(void) { } IProduct* IPadFactory::getProduct() { return new IPad(); } #include "StdAfx.h" #include "IPhoneFactory.h" #include"IPhone.h" IPhoneFactory::IPhoneFactory(void) { } IPhoneFactory::~IPhoneFactory(void) { } IProduct* IPhoneFactory::getProduct() { return new IPhone(); }
調(diào)用方式:
#include "stdafx.h" #include"IFactory.h" #include"IPadFactory.h" #include"IPhoneFactory.h" #include"IProduct.h" int _tmain(int argc, _TCHAR* argv[]) { IFactory *fac = new IPadFactory(); IProduct *pro = fac->getProduct(); fac = new IPhoneFactory(); pro = fac->getProduct(); return 0; }
應(yīng)用場(chǎng)景:
1..net里面的數(shù)據(jù)庫連接對(duì)象就是產(chǎn)生數(shù)據(jù)命令對(duì)象的工廠。每種數(shù)據(jù)庫的connection對(duì)象里(繼承自IDbConnection)都有對(duì)自己createCommand(定義在IDbCommand里)的實(shí)現(xiàn)。
2..net里面的迭代器,IEnumerable定義了迭代器的接口,即工廠方法,每一個(gè)繼承自IEnumerable的類都要實(shí)現(xiàn)GetEnumerator??梢詤⒖碅rrayList,String的GetEnumerator方法。他們都繼承自IEnumerable。
對(duì)比簡(jiǎn)單工廠模式與工廠方法模式:
1. 結(jié)構(gòu)復(fù)雜度
從這個(gè)角度比較,顯然簡(jiǎn)單工廠模式要占優(yōu)。簡(jiǎn)單工廠模式只需一個(gè)工廠類,而工廠方法模式的工廠類隨著產(chǎn)品類個(gè)數(shù)增加而增加,這無疑會(huì)使類的個(gè)數(shù)越來越多,從而增加了結(jié)構(gòu)的復(fù)雜程度。
2.代碼復(fù)雜度
代碼復(fù)雜度和結(jié)構(gòu)復(fù)雜度是一對(duì)矛盾,既然簡(jiǎn)單工廠模式在結(jié)構(gòu)方面相對(duì)簡(jiǎn)潔,那么它在代碼方面肯定是比工廠方法模式復(fù)雜的了。簡(jiǎn)單工廠模式的工廠類隨著產(chǎn)品類的增加需要增加很多方法(或代碼),而工廠方法模式每個(gè)具體工廠類只完成單一任務(wù),代碼簡(jiǎn)潔。
3.客戶端編程難度
工廠方法模式雖然在工廠類結(jié)構(gòu)中引入了接口從而滿足了OCP,但是在客戶端編碼中需要對(duì)工廠類進(jìn)行實(shí)例化。而簡(jiǎn)單工廠模式的工廠類是個(gè)靜態(tài)類,在客戶端無需實(shí)例化,這無疑是個(gè)吸引人的優(yōu)點(diǎn)。
4.管理上的難度
這是個(gè)關(guān)鍵的問題。
我 們先談擴(kuò)展。眾所周知,工廠方法模式完全滿足OCP,即它有非常良好的擴(kuò)展性。那是否就說明了簡(jiǎn)單工廠模式就沒有擴(kuò)展性呢?答案是否定的。簡(jiǎn)單工廠模式同 樣具備良好的擴(kuò)展性——擴(kuò)展的時(shí)候僅需要修改少量的代碼(修改工廠類的代碼)就可以滿足擴(kuò)展性的要求了。盡管這沒有完全滿足OCP,但筆者認(rèn)為不需要太拘 泥于設(shè)計(jì)理論。
然后我們從維護(hù)性的角度分析下。假如某個(gè)具體產(chǎn)品類需要進(jìn)行一定的修改,很可能需要修改對(duì)應(yīng)的工廠類。當(dāng)同時(shí) 需要修改多個(gè)產(chǎn)品類的時(shí)候,對(duì)工廠類的修改會(huì)變得相當(dāng)麻煩(對(duì)號(hào)入座已經(jīng)是個(gè)問題了)。反而簡(jiǎn)單工廠沒有這些麻煩,當(dāng)多個(gè)產(chǎn)品類需要修改是,簡(jiǎn)單工廠模式 仍然僅僅需要修改唯一的工廠類(無論怎樣都能改到滿足要求吧?大不了把這個(gè)類重寫)。
由以上的分析,筆者認(rèn)為簡(jiǎn)單工廠模式更好用更方便些。當(dāng)然這只是筆者的個(gè)人看法而已,畢竟公認(rèn)的,工廠方法模式比簡(jiǎn)單工廠模式更“先進(jìn)”。但有時(shí)過于先進(jìn)的東西未必適合自己,這個(gè)見仁見智吧。
上一篇:通過C++程序示例理解設(shè)計(jì)模式中的外觀模式
欄 目:C語言
下一篇:解析設(shè)計(jì)模式中的Prototype原型模式及在C++中的使用
本文標(biāo)題:舉例解析設(shè)計(jì)模式中的工廠方法模式在C++編程中的運(yùn)用
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2462.html
您可能感興趣的文章
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10深入解析最長(zhǎng)公共子串
- 01-10深入解析Linux下\r\n的問題
- 01-10Linux線程管理必備:解析互斥量與條件變量的詳解
- 01-10解析Linux下的時(shí)間函數(shù):設(shè)置以及獲取時(shí)間的方法
- 01-10DHCP:解析開發(fā)板上動(dòng)態(tài)獲取ip的2種實(shí)現(xiàn)方法詳解
- 01-10節(jié)序問題:解析大小的端判定
- 01-10解析如何在C語言中調(diào)用shell命令的實(shí)現(xiàn)方法
- 01-10解析c中stdout與stderr容易忽視的一些細(xì)節(jié)
- 01-10深入解析C中的數(shù)值與真假


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 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ù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子