国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

舉例解析設(shè)計模式中的工廠方法模式在C++編程中的運用

2020-05-23 14:08:37
字體:
供稿:網(wǎng)友
這篇文章主要介紹了設(shè)計模式中的工廠方法模式在C++編程中的運用,文中也對簡單工廠模式和工廠方法模式進(jìn)行了簡單的對比,需要的朋友可以參考下
 

工廠方法模式不同于簡單工廠模式的地方在于工廠方法模式把對象的創(chuàng)建過程放到里子類里。這樣工廠父對象和產(chǎn)品父對象一樣,可以是抽象類或者接口,只定義相應(yīng)的規(guī)范或操作,不涉及具體的創(chuàng)建或?qū)崿F(xiàn)細(xì)節(jié)。
其類圖如下:

舉例解析設(shè)計模式中的工廠方法模式在C++編程中的運用

實例代碼為:

#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)鍵的實現(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)用場景:
1..net里面的數(shù)據(jù)庫連接對象就是產(chǎn)生數(shù)據(jù)命令對象的工廠。每種數(shù)據(jù)庫的connection對象里(繼承自IDbConnection)都有對自己createCommand(定義在IDbCommand里)的實現(xiàn)。
2..net里面的迭代器,IEnumerable定義了迭代器的接口,即工廠方法,每一個繼承自IEnumerable的類都要實現(xiàn)GetEnumerator。可以參看ArrayList,String的GetEnumerator方法。他們都繼承自IEnumerable。

對比簡單工廠模式與工廠方法模式:

1. 結(jié)構(gòu)復(fù)雜度

從這個角度比較,顯然簡單工廠模式要占優(yōu)。簡單工廠模式只需一個工廠類,而工廠方法模式的工廠類隨著產(chǎn)品類個數(shù)增加而增加,這無疑會使類的個數(shù)越來越多,從而增加了結(jié)構(gòu)的復(fù)雜程度。

2.代碼復(fù)雜度

代碼復(fù)雜度和結(jié)構(gòu)復(fù)雜度是一對矛盾,既然簡單工廠模式在結(jié)構(gòu)方面相對簡潔,那么它在代碼方面肯定是比工廠方法模式復(fù)雜的了。簡單工廠模式的工廠類隨著產(chǎn)品類的增加需要增加很多方法(或代碼),而工廠方法模式每個具體工廠類只完成單一任務(wù),代碼簡潔。

3.客戶端編程難度

工廠方法模式雖然在工廠類結(jié)構(gòu)中引入了接口從而滿足了OCP,但是在客戶端編碼中需要對工廠類進(jìn)行實例化。而簡單工廠模式的工廠類是個靜態(tài)類,在客戶端無需實例化,這無疑是個吸引人的優(yōu)點。

4.管理上的難度

這是個關(guān)鍵的問題。

我 們先談擴(kuò)展。眾所周知,工廠方法模式完全滿足OCP,即它有非常良好的擴(kuò)展性。那是否就說明了簡單工廠模式就沒有擴(kuò)展性呢?答案是否定的。簡單工廠模式同 樣具備良好的擴(kuò)展性——擴(kuò)展的時候僅需要修改少量的代碼(修改工廠類的代碼)就可以滿足擴(kuò)展性的要求了。盡管這沒有完全滿足OCP,但筆者認(rèn)為不需要太拘 泥于設(shè)計理論。

然后我們從維護(hù)性的角度分析下。假如某個具體產(chǎn)品類需要進(jìn)行一定的修改,很可能需要修改對應(yīng)的工廠類。當(dāng)同時 需要修改多個產(chǎn)品類的時候,對工廠類的修改會變得相當(dāng)麻煩(對號入座已經(jīng)是個問題了)。反而簡單工廠沒有這些麻煩,當(dāng)多個產(chǎn)品類需要修改是,簡單工廠模式 仍然僅僅需要修改唯一的工廠類(無論怎樣都能改到滿足要求吧?大不了把這個類重寫)。

由以上的分析,筆者認(rèn)為簡單工廠模式更好用更方便些。當(dāng)然這只是筆者的個人看法而已,畢竟公認(rèn)的,工廠方法模式比簡單工廠模式更“先進(jìn)”。但有時過于先進(jìn)的東西未必適合自己,這個見仁見智吧。



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 河北区| 通化市| 高雄市| 兴化市| 罗田县| 东丰县| 巴林左旗| 白朗县| 西丰县| 滦平县| 项城市| 边坝县| 恩施市| 望江县| 若尔盖县| 宜兰市| 西和县| 德令哈市| 彰化县| 安图县| 金川县| 于都县| 牟定县| 漯河市| 山东| 吉隆县| 宜良县| 绥德县| 黄龙县| 凤山市| 蚌埠市| 土默特左旗| 土默特左旗| 平乐县| 洞口县| 正宁县| 安平县| 安康市| 体育| 望江县| 盐边县|