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

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

C++設計模式之抽象工廠模式

2020-01-26 15:17:33
字體:
來源:轉載
供稿:網友

問題描述

之前講到了C++設計模式――工廠方法模式,我們可能會想到,后期產品會越來越多了,建立的工廠也會越來越多,工廠進行了增長,工廠變的凌亂而難于管理;由于工廠方法模式創建的對象都是繼承于Product的,所以工廠方法模式中,每個工廠只能創建單一種類的產品,當需要生產一種全新的產品(不繼承自Product)時,發現工廠方法是心有余而力不足。

舉個例子來說:一個顯示器電路板廠商,旗下的顯示器電路板種類有非液晶的和液晶的;這個時候,廠商建造兩個工廠,工廠A負責生產非液晶顯示器電路板,工廠B負責生產液晶顯示器電路板;工廠一直就這樣運行著。有一天,總經理發現,直接生產顯示器的其余部分也挺掙錢,所以,總經理決定,再建立兩個工廠C和D;C負責生產非液晶顯示器的其余部件,D負責生產液晶顯示器的其余部件。此時,旁邊參謀的人就說了,經理,這樣做不好,我們可以直接在工廠A中添加一條負責生產非液晶顯示器的其余部件的生產線,在工廠B中添加一條生產液晶顯示器的其余部件的生產線,這樣就可以不用增加廠房,只用將現有廠房進行擴大一下,同時也方便工廠的管理,而且生產非液晶顯示器電路板的技術人員對非液晶顯示的其余部件的生產具有指導的作用,生產液晶顯示器電路板也是同理。總經理發現這是一個不錯的主意。

再回到軟件開發的過程中來,工廠A和B就是之前所說的C++設計模式――工廠方法模式;總經理再次建立工廠C和D,就是重復C++設計模式――工廠方法模式,只是生產的產品不同罷了。這樣做的弊端就如參謀所說的那樣,增加了管理成本和人力成本。在面向對象開發的過程中,是很注重對象管理和維護的,對象越多,就越難進行管理和維護;如果工廠數量過多,那么管理和維護的成本將大大增加;雖然生產的是不同的產品,但是可以二者之間是有微妙的關系的,如參謀所說,技術人員的一些技術經驗是可以借鑒的,這就相當于同一個類中的不同對象,之間是可以公用某些資源的。那么,增加一條流水線,擴大廠房,當然是最好的主意了。

實際問題已經得到了解決,那么如何使用設計模式模擬這個實際的問題呢?那就是接下來所說的抽象工廠模式。

UML類圖

現在要講的抽象工廠模式,就是工廠方法模式的擴展和延伸,但是抽象工廠模式,更有一般性和代表性;它具有工廠方法具有的優點,也增加了解決實際問題的能力。

如圖所示,抽象工廠模式,就好比是兩個工廠方法模式的疊加。抽象工廠創建的是一系列相關的對象,其中創建的實現其實就是采用的工廠方法模式。在工廠Factory中的每一個方法,就好比是一條生產線,而生產線實際需要生產什么樣的產品,這是由Factory1和Factory2去決定的,這樣便延遲了具體子類的實例化;同時集中化了生產線的管理,節省了資源的浪費。

適用場合

工廠方法模式適用于產品種類結構單一的場合,為一類產品提供創建的接口;而抽象工廠方法適用于產品種類結構多的場合,主要用于創建一組(有多個種類)相關的產品,為它們提供創建的接口;就是當具有多個抽象角色時,抽象工廠便可以派上用場。

代碼實現

/*** FileName   : AbstractFactoryPatternDemo** Author    : Jelly Young** Date     : 2013/11/19** Description : More information*/  #include <iostream>using namespace std; // Product Aclass ProductA{public:  virtual void Show() = 0;}; class ProductA1 : public ProductA{public:  void Show()  {    cout<<"I'm ProductA1"<<endl;  }}; class ProductA2 : public ProductA{public:  void Show()  {    cout<<"I'm ProductA2"<<endl;  }}; // Product Bclass ProductB{public:  virtual void Show() = 0;}; class ProductB1 : public ProductB{public:  void Show()  {    cout<<"I'm ProductB1"<<endl;  }}; class ProductB2 : public ProductB{public:  void Show()  {    cout<<"I'm ProductB2"<<endl;  }}; // Factoryclass Factory{public:  virtual ProductA *CreateProductA() = 0;  virtual ProductB *CreateProductB() = 0;}; class Factory1 : public Factory{public:  ProductA *CreateProductA()  {    return new ProductA1();  }   ProductB *CreateProductB()  {    return new ProductB1();  }}; class Factory2 : public Factory{  ProductA *CreateProductA()  {    return new ProductA2();  }   ProductB *CreateProductB()  {    return new ProductB2();  }}; int main(int argc, char *argv[]){  Factory *factoryObj1 = new Factory1();  ProductA *productObjA1 = factoryObj1->CreateProductA();  ProductB *productObjB1 = factoryObj1->CreateProductB();   productObjA1->Show();  productObjB1->Show();   Factory *factoryObj2 = new Factory2();  ProductA *productObjA2 = factoryObj2->CreateProductA();  ProductB *productObjB2 = factoryObj2->CreateProductB();   productObjA2->Show();  productObjB2->Show();   if (factoryObj1 != NULL)  {    delete factoryObj1;    factoryObj1 = NULL;  }   if (productObjA1 != NULL)  {    delete productObjA1;    productObjA1= NULL;  }   if (productObjB1 != NULL)  {    delete productObjB1;    productObjB1 = NULL;  }   if (factoryObj2 != NULL)  {    delete factoryObj2;    factoryObj2 = NULL;  }   if (productObjA2 != NULL)  {    delete productObjA2;    productObjA2 = NULL;  }   if (productObjB2 != NULL)  {    delete productObjB2;    productObjB2 = NULL;  }}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 逊克县| 大兴区| 衡山县| 河源市| 革吉县| 中阳县| 海口市| 达日县| 九龙县| 疏勒县| 瓦房店市| 德钦县| 筠连县| 景宁| 平遥县| 三江| 新乡县| 华亭县| 扶风县| 彭水| 丹棱县| 绵竹市| 耿马| 宜章县| 清河县| 梓潼县| 海原县| 同心县| 高陵县| 中阳县| 周至县| 洪湖市| 江门市| 胶南市| 五大连池市| 威远县| 凯里市| 马关县| 合水县| 共和县| 凤山市|