C++設計模式之抽象工廠模式
問題描述
之前講到了C++設計模式——工廠方法模式,我們可能會想到,后期產(chǎn)品會越來越多了,建立的工廠也會越來越多,工廠進行了增長,工廠變的凌亂而難于管理;由于工廠方法模式創(chuàng)建的對象都是繼承于Product的,所以工廠方法模式中,每個工廠只能創(chuàng)建單一種類的產(chǎn)品,當需要生產(chǎn)一種全新的產(chǎn)品(不繼承自Product)時,發(fā)現(xiàn)工廠方法是心有余而力不足。
舉個例子來說:一個顯示器電路板廠商,旗下的顯示器電路板種類有非液晶的和液晶的;這個時候,廠商建造兩個工廠,工廠A負責生產(chǎn)非液晶顯示器電路板,工廠B負責生產(chǎn)液晶顯示器電路板;工廠一直就這樣運行著。有一天,總經(jīng)理發(fā)現(xiàn),直接生產(chǎn)顯示器的其余部分也挺掙錢,所以,總經(jīng)理決定,再建立兩個工廠C和D;C負責生產(chǎn)非液晶顯示器的其余部件,D負責生產(chǎn)液晶顯示器的其余部件。此時,旁邊參謀的人就說了,經(jīng)理,這樣做不好,我們可以直接在工廠A中添加一條負責生產(chǎn)非液晶顯示器的其余部件的生產(chǎn)線,在工廠B中添加一條生產(chǎn)液晶顯示器的其余部件的生產(chǎn)線,這樣就可以不用增加廠房,只用將現(xiàn)有廠房進行擴大一下,同時也方便工廠的管理,而且生產(chǎn)非液晶顯示器電路板的技術(shù)人員對非液晶顯示的其余部件的生產(chǎn)具有指導的作用,生產(chǎn)液晶顯示器電路板也是同理。總經(jīng)理發(fā)現(xiàn)這是一個不錯的主意。
再回到軟件開發(fā)的過程中來,工廠A和B就是之前所說的C++設計模式——工廠方法模式;總經(jīng)理再次建立工廠C和D,就是重復C++設計模式——工廠方法模式,只是生產(chǎn)的產(chǎn)品不同罷了。這樣做的弊端就如參謀所說的那樣,增加了管理成本和人力成本。在面向?qū)ο箝_發(fā)的過程中,是很注重對象管理和維護的,對象越多,就越難進行管理和維護;如果工廠數(shù)量過多,那么管理和維護的成本將大大增加;雖然生產(chǎn)的是不同的產(chǎn)品,但是可以二者之間是有微妙的關(guān)系的,如參謀所說,技術(shù)人員的一些技術(shù)經(jīng)驗是可以借鑒的,這就相當于同一個類中的不同對象,之間是可以公用某些資源的。那么,增加一條流水線,擴大廠房,當然是最好的主意了。
實際問題已經(jīng)得到了解決,那么如何使用設計模式模擬這個實際的問題呢?那就是接下來所說的抽象工廠模式。
UML類圖
現(xiàn)在要講的抽象工廠模式,就是工廠方法模式的擴展和延伸,但是抽象工廠模式,更有一般性和代表性;它具有工廠方法具有的優(yōu)點,也增加了解決實際問題的能力。
如圖所示,抽象工廠模式,就好比是兩個工廠方法模式的疊加。抽象工廠創(chuàng)建的是一系列相關(guān)的對象,其中創(chuàng)建的實現(xiàn)其實就是采用的工廠方法模式。在工廠Factory中的每一個方法,就好比是一條生產(chǎn)線,而生產(chǎn)線實際需要生產(chǎn)什么樣的產(chǎn)品,這是由Factory1和Factory2去決定的,這樣便延遲了具體子類的實例化;同時集中化了生產(chǎn)線的管理,節(jié)省了資源的浪費。
適用場合
工廠方法模式適用于產(chǎn)品種類結(jié)構(gòu)單一的場合,為一類產(chǎn)品提供創(chuàng)建的接口;而抽象工廠方法適用于產(chǎn)品種類結(jié)構(gòu)多的場合,主要用于創(chuàng)建一組(有多個種類)相關(guān)的產(chǎn)品,為它們提供創(chuàng)建的接口;就是當具有多個抽象角色時,抽象工廠便可以派上用場。
代碼實現(xiàn)
/* ** FileName : AbstractFactoryPatternDemo ** Author : Jelly Young ** Date : 2013/11/19 ** Description : More information */ #include <iostream> using namespace std; // Product A class 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 B class 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; } }; // Factory class 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; } }
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)鏈表隊列的實現(xiàn)
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)鏈表隊列的實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07Windows10配置VSCode C++環(huán)境(超詳細,面向小白以及大佬們)
這篇文章主要介紹了Windows10配置VSCode C++環(huán)境(超詳細,面向小白以及大佬們),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12