1. 程式人生 > >設計模式C++實現(1)——工廠模式

設計模式C++實現(1)——工廠模式

       軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》和《設計模式:可複用面向物件軟體的基礎》兩本書。本文介紹工廠模式的實現。

       工廠模式屬於建立型模式,大致可以分為三類,簡單工廠模式、工廠方法模式、抽象工廠模式。聽上去差不多,都是工廠模式。下面一個個介紹,首先介紹簡單工廠模式,它的主要特點是需要在工廠類中做判斷,從而創造相應的產品。當增加新的產品時,就需要修改工廠類。有點抽象,舉個例子就明白了。有一家生產處理器核的廠家,它只有一個工廠,能夠生產兩種型號的處理器核。客戶需要什麼樣的處理器核,一定要顯示地告訴生產工廠。下面給出一種實現方案。

[cpp] view plaincopyprint?
  1. enum CTYPE {COREA, COREB};     
  2. class SingleCore    
  3. {    
  4. public:    
  5.     virtualvoid Show() = 0;  
  6. };    
  7. //單核A  
  8. class SingleCoreA: public SingleCore    
  9. {    
  10. public:    
  11.     void Show() { cout<<"SingleCore A"<<endl; }    
  12. };    
  13. //單核B  
  14. class SingleCoreB: 
    public SingleCore    
  15. {    
  16. public:    
  17.     void Show() { cout<<"SingleCore B"<<endl; }    
  18. };    
  19. //唯一的工廠,可以生產兩種型號的處理器核,在內部判斷  
  20. class Factory    
  21. {    
  22. public:     
  23.     SingleCore* CreateSingleCore(enum CTYPE ctype)    
  24.     {    
  25.         if(ctype == COREA) //工廠內部判斷  
  26.             returnnew SingleCoreA(); 
    //生產核A  
  27.         elseif(ctype == COREB)    
  28.             returnnew SingleCoreB(); //生產核B  
  29.         else
  30.             return NULL;    
  31.     }    
  32. };    

       這樣設計的主要缺點之前也提到過,就是要增加新的核型別時,就需要修改工廠類。這就違反了開放封閉原則:軟體實體(類、模組、函式)可以擴充套件,但是不可修改。於是,工廠方法模式出現了。所謂工廠方法模式,是指定義一個用於建立物件的介面,讓子類決定例項化哪一個類。Factory Method使一個類的例項化延遲到其子類。

       聽起來很抽象,還是以剛才的例子解釋。這家生產處理器核的產家賺了不少錢,於是決定再開設一個工廠專門用來生產B型號的單核,而原來的工廠專門用來生產A型號的單核。這時,客戶要做的是找好工廠,比如要A型號的核,就找A工廠要;否則找B工廠要,不再需要告訴工廠具體要什麼型號的處理器核了。下面給出一個實現方案。

[cpp] view plaincopyprint?
  1. class SingleCore    
  2. {    
  3. public:    
  4.     virtualvoid Show() = 0;  
  5. };    
  6. //單核A  
  7. class SingleCoreA: public SingleCore    
  8. {    
  9. public:    
  10.     void Show() { cout<<"SingleCore A"<<endl; }    
  11. };    
  12. //單核B  
  13. class SingleCoreB: public SingleCore    
  14. {    
  15. public:    
  16.     void Show() { cout<<"SingleCore B"<<endl; }    
  17. };    
  18. class Factory    
  19. {    
  20. public:    
  21.     virtual SingleCore* CreateSingleCore() = 0;  
  22. };    
  23. //生產A核的工廠  
  24. class FactoryA: public Factory    
  25. {    
  26. public:    
  27.     SingleCoreA* CreateSingleCore() { returnnew SingleCoreA; }    
  28. };    
  29. //生產B核的工廠  
  30. class FactoryB: public Factory    
  31. {    
  32. public:    
  33.     SingleCoreB* CreateSingleCore() { returnnew SingleCoreB; }    
  34. };    

       工廠方法模式也有缺點,每增加一種產品,就需要增加一個物件的工廠。如果這家公司發展迅速,推出了很多新的處理器核,那麼就要開設相應的新工廠。在C++實現中,就是要定義一個個的工廠類。顯然,相比簡單工廠模式,工廠方法模式需要更多的類定義。

       既然有了簡單工廠模式和工廠方法模式,為什麼還要有抽象工廠模式呢?它到底有什麼作用呢?還是舉這個例子,這家公司的技術不斷進步,不僅可以生產單核處理器,也能生產多核處理器。現在簡單工廠模式和工廠方法模式都鞭長莫及。抽象工廠模式登場了。它的定義為提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。具體這樣應用,這家公司還是開設兩個工廠,一個專門用來生產A型號的單核多核處理器,而另一個工廠專門用來生產B型號的單核多核處理器,下面給出實現的程式碼。

[cpp] view plaincopyprint?
  1. //單核  
  2. class SingleCore     
  3. {    
  4. public:    
  5.     virtualvoid Show() = 0;  
  6. };    
  7. class SingleCoreA: public SingleCore      
  8. {    
  9. public:    
  10.     void Show() { cout<<"Single Core A"<<endl; }    
  11. };    
  12. class SingleCoreB :public SingleCore    
  13. {    
  14. public:    
  15.     void Show() { cout<<"Single Core B"<<endl; }    
  16. };    
  17. //多核  
  18. class MultiCore      
  19. {    
  20. public:    
  21.     virtualvoid Show() = 0;  
  22. };    
  23. class MultiCoreA : public MultiCore      
  24. {    
  25. public:    
  26.     void Show() { cout<<"Multi Core A"<<endl; }    
  27. };    
  28. class MultiCoreB : public MultiCore      
  29. {    
  30. public:    
  31.     void Show() { cout<<"Multi Core B"<<endl; }    
  32. };    
  33. //工廠  
  34. class CoreFactory      
  35. {    
  36. public:    
  37.     virtual SingleCore* CreateSingleCore() = 0;  
  38.     virtual MultiCore* CreateMultiCore() = 0;  
  39. };    
  40. //工廠A,專門用來生產A型號的處理器  
  41. class FactoryA :public CoreFactory    
  42. {    
  43. public:    
  44.     SingleCore* CreateSingleCore() { returnnew SingleCoreA(); }    
  45.     MultiCore* CreateMultiCore() { returnnew MultiCoreA(); }    
  46. };    
  47. //工廠B,專門用來生產B型號的處理器  
  48. class FactoryB : public CoreFactory    
  49. {    
  50. public:    
  51.     SingleCore* CreateSingleCore() { returnnew SingleCoreB(); }    
  52.     MultiCore* CreateMultiCore() { returnnew MultiCoreB(); }    
  53. };   

        至此,工廠模式介紹完了。利用Rational Rose 2003軟體,給出三種工廠模式的UML圖,加深印象。

         簡單工廠模式的UML圖:

         工廠方法的UML圖:

         抽象工廠模式的UML圖:


相關推薦

設計模式C++實現1——工廠模式

       軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》

設計模式C++實現2——策略模式

       軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一

設計模式C++實現3——介面卡模式

        軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深

設計模式C++實現12——備忘錄模式

       軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》

設計模式C++實現20——直譯器模式

1. 直譯器模式(Interpreter Pattern)的定義 (1)定義   給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。   ①文法:即語法規則。在直譯器模式中每一個語法都將對應一個直譯器物件,用來處理相應的

設計模式C++實現11——裝飾模式

          軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,

設計模式C++實現5——原型模式、模板方法模式

       軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一

設計模式1--工廠模式

工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。 在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。 介紹 意圖:定義一個建立物件的介面

設計模式C++實現9——享元模式

        軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》

設計模式 c++版9——原型模式

定義:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。 示例一:個性化電子賬單 1. 需求說明: 銀行傳送電子賬單的郵件一般是有要求的:①個性化服務:發過去的郵件上總有一些個人資訊,比如姓氏等。②遞送成功率:若大批量地傳送郵件會被收房郵件伺服器誤認為是

設計模式 c++版13——策略模式

定義: 定義一組演算法,將每個演算法都封裝起來,並且使他們之間可以互換 示例一:策略模式(通用版) 1. 類圖18-3 2. 類圖說明 策略模式使用的就是面向物件的繼承和多型機制 Context 封裝角色。也叫上下文角色,起承上啟下的封裝作用,遮蔽高層模組對策

設計模式 c++版18——門面模式

定義: 要求一個子系統的外部與其內部的通訊必須通過一個統一的物件進行。門面模式提供一個高層次的介面,使得子系統更易於使用(門面模式也叫做外觀模式)。 示例一:門面模式(通用版) 1. 類圖23-4 2. 類圖說明 Subsystem Classes 是子系統所有

KD樹+BBF+KNN使用C#實現1

       最近研究了一下KD樹,以及在此基礎之上進行的改進BBF方法,以及如何利用BBF進行KNN。當然我還是主要參照很厲害的人物文章,程式碼利用C#實現了而已。        在這裡對我幫助最大的網址如下:      這篇文章主要講的就是K近鄰,距離度量,KD樹,以及

六種常用的設計模式java實現模板模式

模板模式,估計大家應該都接觸過,比如說,在完成某個業務邏輯前,需要處理一點事,在完成後也要處理一點事,這樣就可以把不一樣的地方給抽象出來,然後公共的地方都是一樣的,這樣的場景就會用到模板模式。 一、基本概念 模板方法模式是類的行為模式。準備一個抽象類,將部分

設計模式 c++版19—— 狀態模式

定義: 當一個物件內在狀態改變時允許其改變行為,這個物件看起來像改變了其類。(狀態的變更引起了行為的變更,從外部看起來好像這個物件對應的類發生了改變一樣) 示例一:狀態模式(通用版) 1. 類圖 26-5 2. 類圖說明 State 抽象狀態角色 介面或抽象類,

代理模式,簡單靜態工廠模式,單例模式,模板方法模式個人理解

簡言: java中總共有23種設計模式,每個模式的出現都是為了解決某一方面的問題,所以這23種設計模式有他們各自適用的地方(廢話有點多),而設計模式的產生主要是為了降低類與類之間的耦合度。下面我們就簡單的瞭解一下幾種設計模式及使用的地方。 1.單例模式:

設計模式 c++版5——抽象工廠模式

定義:為建立一組相關或相互依賴的物件提供一個介面,而且無需指定它們的具體類 示例一:女媧造人擴充套件 造出來黑、白、黃種人,分別有性別分類 類圖說明:一個介面,多個抽象類,N個實現類,每個人種都是一個抽象類,性別是在各個實現類中實現的。 1. 結構說明: HumanF

設計模式學習總結1簡單工廠模式工廠方法模式、抽象工廠模式

設計模式學習 做了幾個專案,發現設計模式的好處還是很多的,這東西就是隻有你真正用到的時候才知道他的好處,否則學了也不知道所以然。所以設計模式學習我認為可以在先進行幾個專案後,再來學習,這樣學習的效果和感受才是最好的。 這次是做一個學習的筆記,內容還是主要以我看的兩本書《大

C/C++語法淺談二十三種設計模式——工廠模式Factory Method

0.寫在前面 在軟體開發過程中,為了提高開發效率、增強軟體執行的穩定性,降低後期專案維護的成本,我們志在追求更加高效、簡單的設計思路來引領我們的專案產品,在經過不斷的探索與總結的過程中,我們最常用的設計模式有23中,總體分為三大類,即建立型模式、結構型模式和行為型模式,具體如下:

設計模式實現---策略模式、策略模式與簡單工廠模式結合使用

策略模式(Strategy): 它定義了演算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的使用者。 策略模式大致實現方法 #include <stdio.h> //抽象演算法類 class Strategy { pu