C++設計形式之籠統工場形式。本站提示廣大學習愛好者:(C++設計形式之籠統工場形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計形式之籠統工場形式正文
成績描寫
之前講到了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 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; } }