標籤:設計模式 c++ 原廠模式
說的直接點,原廠模式就是接管對象的建立,在new()的同時既可以做額外的異常處理、初始化等操作,又可以降低模組間的耦合,方便維護和拓展。
根據建立對象的複雜度,可以分為簡單原廠模式、工廠法模式和抽象原廠模式。
一、簡單原廠模式
ProductA、ProductB和ProductC繼承自Product虛擬類,Show方法是不同產品的自描述;Factory依賴於ProductA、ProductB和ProductC,Factory根據不同的條件建立不同的Product對象。
typedef enum ProductTypeTag{TypeA,TypeB,TypeC}PRODUCTTYPE;// Here is the product classclass 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 ProductC : public Product{public:void Show(){cout<<"I'm ProductC"<<endl;}};// Here is the Factory classclass Factory{public:Product* CreateProduct(PRODUCTTYPE type){switch (type){case TypeA:return new ProductA();case TypeB:return new ProductB();case TypeC:return new ProductC();default:return NULL;}}};
簡單的對繼承自虛基類product的三種類的對象建立的封裝,約束是:productA、productB、productC都是繼承自product的類型,可以利用多態特性。
另外,只有一種product子類,也屬於簡單原廠模式。
二、工廠法模式
由於簡單原廠模式的局限性,比如:工廠現在能生產ProductA、ProductB和ProductC三種產品了,此時,需要增加生產ProductD產品;那麼,首先是不是需要在產品枚舉類型中添加新的產品類型標識,然後,修改Factory類中的switch結構代碼。是的,這種對代碼的修改,對原有代碼的改動量較大。出於種種原因,簡單原廠模式,在實際項目中使用的較少。
那該怎麼辦?
《head first》中以製作pizza為例,定義了一個虛基類pizzaStore,內含一個純虛函數createpizza(),通過繼承這個虛基類重載createpizza()就可以製作出口味不同的pizza。
Factory 方法模式是在簡單原廠模式的基礎上,對“工廠”添加了一個抽象層。將工廠共同的動作抽象出來,作為抽象類別,而具體的行為由子類本身去實現,讓子類去決定生產什麼樣的產品。
這樣,想增加一種產品productC,只需繼承抽象層factory建造一個新的工廠factoryC,來製造新的產品。原來已有的工廠不需要修改。Factory 方法模式的意義是定義一個建立產品對象的工廠介面,將實際建立工作延遲到子類當中。核心工廠類不再負責產品的建立,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得Factory 方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
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 ();}};
三、抽象原廠模式
我們可能會想到,後期產品會越來越多了,建立的工廠也會越來越多,工廠進行了增長,工廠變的淩亂而難於管理;由於Factory 方法模式建立的對象都是繼承於Product的,所以Factory 方法模式中,每個工廠只能建立單一種類的產品,當需要生產一種全新的產品(不繼承自Product)時,發現Factory 方法是心有餘而力不足。
Factory 方法模式適用於產品種類結構單一的場合,為一類產品提供建立的介面;而抽象Factory 方法適用於產品種類結構多的場合,主要用於建立一組(有多個種類)相關的產品,為它們提供建立的介面;就是當具有多個抽象角色時,抽象工廠便可以派上用場。
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 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();}};
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
[C++設計模式] factory 原廠模式