亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2016年03月05日 09:47:30   作者:runfeel  
這篇文章主要介紹了設(shè)計(jì)模式中的工廠方法模式在C++編程中的運(yùn)用,文中也對(duì)簡(jiǎn)單工廠模式和工廠方法模式進(jìn)行了簡(jiǎn)單的對(duì)比,需要的朋友可以參考下

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

20163594444679.png (883×390)

實(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ù)庫(kù)連接對(duì)象就是產(chǎn)生數(shù)據(jù)命令對(duì)象的工廠。每種數(shù)據(jù)庫(kù)的connection對(duì)象里(繼承自IDbConnection)都有對(duì)自己createCommand(定義在IDbCommand里)的實(shí)現(xiàn)。
2..net里面的迭代器,IEnumerable定義了迭代器的接口,即工廠方法,每一個(gè)繼承自IEnumerable的類(lèi)都要實(shí)現(xiàn)GetEnumerator??梢詤⒖碅rrayList,String的GetEnumerator方法。他們都繼承自IEnumerable。

對(duì)比簡(jiǎn)單工廠模式與工廠方法模式:

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

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

2.代碼復(fù)雜度

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

3.客戶(hù)端編程難度

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

4.管理上的難度

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

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

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

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

相關(guān)文章

最新評(píng)論