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

首頁(yè) > 編程 > C++ > 正文

C++設(shè)計(jì)模式之工廠方法模式

2020-01-26 15:17:33
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

問(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)品枚舉類(lèi)型中添加新的產(chǎn)品類(lèi)型標(biāo)識(shí),然后,修改Factory類(lèi)中的switch結(jié)構(gòu)代碼。是的,這種對(duì)代碼的修改,對(duì)原有代碼的改動(dòng)量較大,易產(chǎn)生編碼上的錯(cuò)誤(雖然很簡(jiǎn)單,如果工程大了,出錯(cuò)也是在所難免的?。。。?。這種對(duì)代碼的修改是最原始,最野蠻的修改,本質(zhì)上不能稱(chēng)之為對(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類(lèi)圖

那么今天介紹的工廠方法模式,就隆重登場(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),作為抽象類(lèi),而具體的行為由子類(lèi)本身去實(shí)現(xiàn),讓子類(lèi)去決定生產(chǎn)什么樣的產(chǎn)品。

如圖,F(xiàn)actoryA專(zhuān)心負(fù)責(zé)生產(chǎn)ProductA,F(xiàn)actoryB專(zhuān)心負(fù)責(zé)生產(chǎn)ProductB,F(xiàn)actoryA和FactoryB之間沒(méi)有關(guān)系;如果到了后期,如果需要生產(chǎn)ProductC時(shí),我們則可以創(chuàng)建一個(gè)FactoryC工廠類(lèi),該類(lèi)專(zhuān)心負(fù)責(zé)生產(chǎn)ProductC類(lèi)產(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)建工作推遲到子類(lèi)當(dāng)中。核心工廠類(lèi)不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,這樣核心類(lèi)成為一個(gè)抽象工廠角色,僅負(fù)責(zé)具體工廠子類(lèi)必須實(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 //m.survivalescaperooms.com*/ #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;}

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 遵义市| 科尔| 潮安县| 察雅县| 铜山县| 于都县| 开原市| 若羌县| 桐城市| 怀柔区| 防城港市| 梅州市| 蚌埠市| 保山市| 太谷县| 孟州市| 湖口县| 东平县| 甘谷县| 黄大仙区| 中西区| 普定县| 咸宁市| 资溪县| 益阳市| 远安县| 田东县| 莲花县| 东光县| 尉氏县| 万宁市| 托克逊县| 确山县| 合江县| 宽甸| 凌源市| 曲水县| 信宜市| 炎陵县| 十堰市| 沂源县|