1. 程式人生 > >c++工廠模式和c++工廠方法

c++工廠模式和c++工廠方法

問題描述

http://www.jellythink.com/archives/category/columns

之前講到了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.jellythink.com
*/
#include<iostream>usingnamespace std;classProduct{public:virtualvoidShow()=0;};classProductA:publicProduct{public:voidShow(){ cout<<"I'm ProductA"<<endl;}};classProductB:publicProduct{public:voidShow(){ cout<<"I'm ProductB"<<endl;}};classFactory{public:virtualProduct*CreateProduct()=0;};classFactoryA:publicFactory{public:Product*CreateProduct(){returnnewProductA();}};classFactoryB:publicFactory{public:Product*CreateProduct(){returnnewProductB();}};int main(int argc ,char*argv []){Factory*factoryA =newFactoryA();Product*productA = factoryA->CreateProduct(); productA->Show();Factory*factoryB =newFactoryB();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;}return0;}

問題描述

之前講到了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.jellythink.com
*/#include<iostream>usingnamespace std;classProduct{public:virtualvoidShow()=0;};classProductA:publicProduct{public:voidShow(){
		cout<<"I'm ProductA"<<endl;}};classProductB:publicProduct{public:voidShow(){
		cout<<"I'm ProductB"<<endl;}};classFactory{public:virtualProduct*CreateProduct()=0;};classFactoryA:publicFactory{public:Product*CreateProduct(){returnnewProductA();}};classFactoryB:publicFactory{public:Product*CreateProduct(){returnnewProductB();}};int main(int argc ,char*argv []){Factory*factoryA =newFactoryA();Product*productA = factoryA->CreateProduct();
	productA->Show();Factory*factoryB =newFactoryB();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;}return0;}

問題描述

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

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

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

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

UML類圖

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

Abstract Factory Pattern

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

適用場合

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

程式碼實現

/*
** FileName     : AbstractFactoryPatternDemo
** Author       : Jelly Young
** Date         : 2013/11/19
** Description  : More information, please go to http://www.jellythink.com
*/#include<iostream>usingnamespace std;// Product AclassProductA{public:virtualvoidShow()=0;};classProductA1:publicProductA{public:voidShow(){
		cout<<"I'm ProductA1"<<endl;}};classProductA2:publicProductA{public:voidShow(){
		cout<<"I'm ProductA2"<<endl;}};// Product BclassProductB{public:virtualvoidShow()=0;};classProductB1:publicProductB{public:voidShow(){
		cout<<"I'm ProductB1"<<endl;}};classProductB2:publicProductB{public:voidShow(){
		cout<<"I'm ProductB2"<<endl;}};// FactoryclassFactory{public:virtualProductA*CreateProductA()=0;virtualProductB*CreateProductB()=0;};classFactory1:publicFactory{public:ProductA*CreateProductA(){returnnewProductA1();}ProductB*CreateProductB(){returnnewProductB1();}};classFactory2:publicFactory{ProductA*CreateProductA(){returnnewProductA2();}ProductB*CreateProductB(){returnnewProductB2();}};int main(int argc,char*argv[]){Factory*factoryObj1 =newFactory1();ProductA*productObjA1 = factoryObj1->CreateProductA();ProductB*productObjB1 = factoryObj1->CreateProductB();

	productObjA1->Show();
	productObjB1->Show();Factory*factoryObj2 =newFactory2();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
            
           

相關推薦

c++工廠模式c++工廠方法

問題描述 http://www.jellythink.com/archives/category/columns 之前講到了C++設計模式——簡單工廠模式,由於簡單工廠模式的侷限性,比如:工廠現在能生產ProductA、ProductB和ProductC三種產品了,此

簡單工廠模式工廠模式抽象工廠模式區別

下面例子中滑鼠,鍵盤,耳麥為產品,惠普,戴爾為工廠。 簡單工廠模式(面向單個產品,不符合開閉原則,要點:產品面向介面) 簡單工廠模式不是 23 種裡的一種,簡而言之,就是有一個專門生產某個產品的類。 比如下圖中的滑鼠工廠,專業生產滑鼠,給引數 0,生產戴爾滑鼠,給引數

走進設計模式的世界4:我不是你,但是大家都把我當成你-工廠模式抽象工廠模式

工廠模式和抽象工廠模式: 工廠方法模式:定義了一個建立物件的介面,但由子類決定要例項化的類是哪一個。工廠方法讓類把例項化推遲到之類。 抽象工廠模式:提供一個介面,用於建立相關或以來物件的家族,而不需要明確指定具體類。 解釋:工廠方法使用繼承把物件的建立交給之類,子類實現工廠方法來建立

簡單工廠工廠模式抽象工廠

  工廠可以分為三種:簡單工廠、工廠模式和抽象工廠,三者的關係是遞進的,以做包子為例,剛開始只有兩種包子:豆腐包和牛肉包,可以使用簡單工廠(或者叫靜態工廠)來解決,隨著包子種類的越來越多,發現沒新增一種包子,就需要改工廠類,擴充套件性太差,因此出現了工廠模式,提取一個公共的做包子介面,然後針對每一種包子建一個

工廠模式 抽象工廠模式

1:工廠模式 :就是建立一個工廠類,對實現了同一介面(Product)的一些類進行例項的建立。    優點:        1、一個呼叫者如果想建立一個物件,只要知道其名稱就可以了。        2、擴充套件性高,如果想增加一個產品,只要擴充套件一個工廠類就可以。   

工廠模式抽象工廠模式以及在Android中的應用

《Android原始碼設計模式解析與實戰》第5章第6章讀書筆記 工廠方法模式介紹 工廠方法模式(Factory Pattern)建立型設計模式之一,在平時開發中或多或少都會使用它,如Android中的Activity裡的各個生命週期方法,以onC

設計模式工廠模式抽象工廠模式

工廠模式(Factory Pattern)的意義就跟它的名字一樣,在面向物件程式設計中,工廠通常是一個用來建立其他物件的物件。工廠模式根據不同的引數來實現不同的分配方案和建立物件。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立

簡單工廠模式工廠模式抽象工廠的區別

簡單工廠模式簡單工廠模式不是23種裡的一種,簡而言之,就是有一個專門生產某個產品的類。比如下圖中的滑鼠工廠,專業生產滑鼠,給引數0,生產戴爾滑鼠,給引數1,生產惠普滑鼠。工廠模式工廠模式也就是滑鼠工廠是個父類,有生產滑鼠這個介面。戴爾滑鼠工廠,惠普滑鼠工廠繼承它,可以分別生產

工廠模式抽象工廠模式總結與比較(屌絲專用)

屌絲有了造錢工廠,神馬都是浮雲。 工廠模式(工廠方法模式): 一個抽象Money(產品類)派生出BlueMoney、RedMoney(多個具體產品類) 一個抽象MoneyFactory(工廠類)派生出BlueMoneyFactory、MoneyFactory(多個具體工廠

簡單工廠模式工廠模式抽象工廠模式區別及優缺點

各位小夥伴好,今天給大家主要介紹一下簡單工廠模式、工廠模式和抽象工廠模式的區別及各自的優缺點。 (本文實現語言為Python3) 【前言】 眾所周知今天所講的內容是設計模式的一類;對於設計模式這個概念,我想首先請大家問問自己:1、什麼是設計模式 2、我們為什麼要了解並學習設計模式? 從我上學的時候我相信大家跟

C++設計模式】簡單工廠工廠方法

#ifndef __FACTORYMETHOD_H__ #define __FACTORYMETHOD_H__ #include <iostream> #include <str

C++設計模式——工廠方法模式抽象工廠方法模式

一、工廠方法模式 上面的簡單工廠模式的缺點是當新增產品的時候就要去修改工廠的類,這就違反了開放封閉原則,(類、模組、函式)可以擴充套件,但是不可以修改,於是,就出現了工廠方法模式。所謂工廠方法模式,是指定義一個用於建立物件的介面,讓子類決定例項化哪一個類。 #d

Note8:C#設計模式工廠方法模式(VS 簡單工廠模式 & 抽象工廠模式

工廠方法模式 blog 抽象工廠 nbsp strong str cnblogs note 設計 一、資源說明 (1)本文有參考:http://www.cnblogs.com/zhili/p/FactoryMethod.html 待更!Note8:C#設計模式—工廠方法

大話設計模式中簡單工廠模式策略模式的商場收銀軟體例項的C++程式碼

策略模式是一種定義一系統演算法的方法,從概念上來看,所有這些演算法完成的都是相同的工作,只是具體的實現不同;策略模式可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類之間的耦合。 策略模式是用來封裝演算法的,但在實踐中,我們發現可以用它來封裝幾乎任何型別的規

C#設計模式之:工廠方法模式

工廠方法模式(Factory Method): 定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類 回顧之前簡單工廠 簡單工廠的核心程式碼 class OperationFactory { public

C++利用反射簡單工廠模式實現業務模組解耦

1. 業務說明 為了便於說明,舉一個簡單的例子。假設現在有一個專案需要建立一個和銀行互動的平臺,目前只接入工商銀行,後續接入其他銀行,每個銀行的業務都有差異,報文格式可能也不一致。 這裡只列舉幾個簡要的流程,僅包括拼報文,傳送報文,接收報文,解析報文,其餘整體架構以及

設計模式——抽象工廠模式C++實現)

concrete out png return style bsp ctp img using 1 #include <iostream> 2 #include <string> 3 4 usin

【設計模式】簡單工廠模式工廠方法模式

產生 for plm nbsp osc rbm play stp mage > 簡單工廠模式 顧名思義,此模式的設計結構是簡單的,核心是生產對象。 一般來說,運用工廠模式生產的對象應該是構建對象的過程比較復雜的,獲取構建對象的過程在日後可能發生變更的。 簡單工廠

C++設計模式01——簡單工廠模式

actor 異常 main turn mes .com factory format 創建過程 http://blog.csdn.net/caoshangpa/article/details/52763923 問題描述 之前在公司做了一個windows 8平臺的閱讀器。

c#設計模式3抽象工廠模式(Abstract Factory)

bubuko write col 實現 trac 技術分享 返回 lin 子類 #region 坦克系列 abstract class Tank { abstract public void Go(); } /// &