標籤:
原廠模式筆記
摘自http://blog.csdn.net/wuzhekai1985
軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性:封裝、繼承、多態,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》和《設計模式:可複用物件導向軟體的基礎》兩本書。本文介紹原廠模式的實現。
原廠模式屬於建立型模式,大致可以分為三類,簡單原廠模式、Factory 方法模式、抽象原廠模式。聽上去差不多,都是原廠模式。下面一個個介紹,首先介紹簡單原廠模式,它的主要特點是需要在工廠類中做判斷,從而創造相應的產品。當增加新的產品時,就需要修改工廠類。有點抽象,舉個例子就明白了。有一家生產處理器核的廠家,它只有一個工廠,能夠生產兩種型號的處理器核。客戶需要什麼樣的處理器核,一定要顯示地告訴生產工廠。下面給出一種實現方案。
1 enum CTYPE {COREA, COREB}; 2 class SingleCore 3 { 4 public: 5 virtual void 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 return new SingleCoreA(); //生產核A 27 else if(ctype == COREB) 28 return new SingleCoreB(); //生產核B 29 else 30 return NULL; 31 } 32 };
這樣設計的主要缺點之前也提到過,就是要增加新的核類型時,就需要修改工廠類。這就違反了開放封閉原則:軟體實體(類、模組、函數)可以擴充,但是不可修改。於是,Factory 方法模式出現了。所謂Factory 方法模式,是指定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。Factory Method使一個類的執行個體化延遲到其子類。
聽起來很抽象,還是以剛才的例子解釋。這家生產處理器核的產家賺了不少錢,於是決定再開設一個工廠專門用來生產B型號的單核,而原來的工廠專門用來生產A型號的單核。這時,客戶要做的是找好工廠,比如要A型號的核,就找A工廠要;否則找B工廠要,不再需要告訴工廠具體要什麼型號的處理器核了。下面給出一個實現方案。
1 class SingleCore 2 { 3 public: 4 virtual void 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() { return new SingleCoreA; } 28 }; 29 //生產B核的工廠 30 class FactoryB: public Factory 31 { 32 public: 33 SingleCoreB* CreateSingleCore() { return new SingleCoreB; } 34 };
Factory 方法模式也有缺點,每增加一種產品,就需要增加一個對象的工廠。如果這家公司發展迅速,推出了很多新的處理器核,那麼就要開設相應的新工廠。在C++實現中,就是要定義一個個的工廠類。顯然,相比簡單原廠模式,Factory 方法模式需要更多的類定義。
既然有了簡單原廠模式和Factory 方法模式,為什麼還要有抽象原廠模式呢?它到底有什麼作用呢?還是舉這個例子,這家公司的技術不斷進步,不僅可以生產單核處理器,也能生產多核處理器。現在簡單原廠模式和Factory 方法模式都鞭長莫及。抽象原廠模式登場了。它的定義為提供一個建立一系列相關或相互依賴對象的介面,而無需指定它們具體的類。具體這樣應用,這家公司還是開設兩個工廠,一個專門用來生產A型號的單核多核處理器,而另一個工廠專門用來生產B型號的單核多核處理器,下面給出實現的代碼。
1 //單核 2 class SingleCore 3 { 4 public: 5 virtual void 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 virtual void Show() = 0; 22 }; 23 class MultiCoreA : public MultiCore 24 { 25 public: 26 void Show() { cout<<"Multi Core A"<<endl; } 27 28 }; 29 class MultiCoreB : public MultiCore 30 { 31 public: 32 void Show() { cout<<"Multi Core B"<<endl; } 33 }; 34 //工廠 35 class CoreFactory 36 { 37 public: 38 virtual SingleCore* CreateSingleCore() = 0; 39 virtual MultiCore* CreateMultiCore() = 0; 40 }; 41 //工廠A,專門用來生產A型號的處理器 42 class FactoryA :public CoreFactory 43 { 44 public: 45 SingleCore* CreateSingleCore() { return new SingleCoreA(); } 46 MultiCore* CreateMultiCore() { return new MultiCoreA(); } 47 }; 48 //工廠B,專門用來生產B型號的處理器 49 class FactoryB : public CoreFactory 50 { 51 public: 52 SingleCore* CreateSingleCore() { return new SingleCoreB(); } 53 MultiCore* CreateMultiCore() { return new MultiCoreB(); } 54 };
至此,原廠模式介紹完了。利用Rational Rose 2003軟體,給出三種原廠模式的UML圖,加深印象。
簡單原廠模式的UML圖:
Factory 方法的UML圖:
抽象原廠模式的UML圖:
個人ps:
簡單原廠模式:一個工廠類,工廠生產什麼需要告訴工廠類;
Factory 方法模式:每一個工廠生產一種商品,需要什麼商品,只需要找相應的工廠即可;
抽象原廠模式:一個抽象工廠類,一個抽象商品類,其中分別定義生產和具體商品的介面,具體由哪個工廠生產哪種商品都是由子類決定。
設計模式學習之原廠模式[轉]