C++設計形式之工場辦法形式。本站提示廣大學習愛好者:(C++設計形式之工場辦法形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計形式之工場辦法形式正文
成績描寫
之前講到了C++設計形式——簡略工場形式,因為簡略工場形式的局限性,好比:工場如今能臨盆ProductA、ProductB和ProductC三種產物了,此時,須要增長臨盆ProductD產物;那末,起首是否是須要在產物列舉類型中添加新的產物類型標識,然後,修正Factory類中的switch構造代碼。是的,這類對代碼的修正,對原有代碼的修改量較年夜,易發生編碼上的毛病(固然很簡略,假如工程年夜了,失足也是在所不免的!!!)。這類對代碼的修正是最原始,最蠻橫的修正,實質上不克不及稱之為對代碼的擴大。同時,因為對曾經存在的函數停止了修正,那末之前停止過的測試,都將是有效的,一切的測試,都將須要從新停止,一切的代碼都須要停止從新籠罩。這類,增長本錢,不克不及進步效力的工作,在公司是相對不許可的(除非昏庸的PM)。出於各種緣由,簡略工場形式,在現實項目中應用的較少。那末該怎樣辦?怎樣辦呢?須要對原有代碼影響降到最小,同時能對原有功效停止擴大。
UML類圖
那末明天引見的工場辦法形式,就盛大退場了。它只是對簡略工場形式的擴大,在GOF的引見中,它們是歸並在一路的,而我則是零丁離開停止講授的,就是為了辨別兩者的利害,便於年夜家在現實項目中停止更好的掌握與運用。工場辦法形式是在簡略工場形式的基本上,對“工場”添加了一個籠統層。將工場配合的舉措籠統出來,作為籠統類,而詳細的行動由子類自己去完成,讓子類去決議臨盆甚麼樣的產物。
如圖,FactoryA專心擔任臨盆ProductA,FactoryB專心擔任臨盆ProductB,FactoryA和FactoryB之間沒有關系;假如到了前期,假如須要臨盆ProductC時,我們則可以創立一個FactoryC工場類,該類專心擔任臨盆ProductC類產物。因為FactoryA、FactoryB和FactoryC之間沒有關系,當參加FactoryC參加時,對FactoryA和FactoryB的任務沒有發生任何影響,那末對代碼停止測試時,只須要零丁對FactoryC和ProductC停止單位測試,而FactoryA和FactoryB則不消停止測試,則可省去年夜量無趣無味的測試任務。
實用場所
工場辦法形式的意義是界說一個創立產物對象的工場接口,將現實創立任務推延到子類傍邊。焦點工場類不再擔任產物的創立,如許焦點類成為一個籠統工場腳色,僅擔任詳細工場子類必需完成的接口,如許進一步籠統化的利益是使得工場辦法形式可使體系在不修正詳細工場腳色的情形下引進新的產物。
1.在設計的早期,就斟酌到產物在前期會停止擴大的情形下,可使用工場辦法形式;
2.產物構造較龐雜的情形下,可使用工場辦法形式;
因為應用設計形式是在具體設計時,就須要停止決議確定的,所以,須要衡量多方面的身分,而不克不及為了應用設計形式而應用設計形式。
代碼完成:
/* ** FileName : FactoryMethodPatternDemo ** Author : Jelly Young ** Date : 2013/11/18 ** Description : More information, please go to http://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; }