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


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


