問題描述
之前在公司做了一個windows 8平台的閱讀器。首先,需要將電子書中的內容渲染到屏幕上,而電子書每一頁都包含各種各樣的內容,比如:圖形、圖像和文字等等;不同的內容,就是不同的對象;在將不同的內容渲染到屏幕上之前,就需要new操作,建立不同的對象,然后再在屏幕上進行描繪。這個時候,就需要進行很多new操作,new操作分布在代碼的不同地方,管理起來很麻煩,而且也很亂,到后期擴展和維護的時候,有的時候,對象多的讓開發人員不知道這個對象是干什么的,這就增加了難度;同時,new操作,都會有對應的異常處理,最后,就會發現,在代碼中,new了一個對象,然后,就跟着一段異常處理代碼,這時編碼變的極其混亂和臃腫。那么怎么辦?怎么辦?此時,我們需要一個新的類,專門從事對象的建立和釋放,之后,對象的各種操作,和這個類沒有任何關系。這個專門建立對象的類,向外暴漏創建對象的接口,供外部調用。
工廠模式有一種非常形象的描述,建立對象的類就如一個工廠,而需要被建立的對象就是一個個產品;在工廠中加工產品,使用產品的人,不用在乎產品是如何生產出來的。從軟件開發的角度來說,這樣就有效的降低了模塊之間的耦合。
UML類圖
對於工廠模式,具體上可以分為三類:
- 簡單工廠模式;
- 工廠方法模式;
- 抽象工廠模式。
對於上面的三種工廠模式,從上到下逐步抽象,並且更具一般性。而這篇博文主要講的是簡單工廠模式,后兩種會在之后的博文中接着總結。

ProductA、ProductB和ProductC繼承自Product虛擬類,Show方法是不同產品的自描述;Factory依賴於ProductA、ProductB和ProductC,Factory根據不同的條件創建不同的Product對象。
適用場合
- 在程序中,需要創建的對象很多,導致對象的new操作多且雜時,需要使用簡單工廠模式;
- 由於對象的創建過程是我們不需要去關心的,而我們注重的是對象的實際操作,所以,我們需要分離對象的創建和操作兩部分,如此,方便后期的程序擴展和維護。
代碼實現
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 typedef enum ProductTypeTag 6 { 7 TypeA, 8 TypeB, 9 TypeC 10 }PRODUCTTYPE; 11 12 // Here is the product class 13 class Product 14 { 15 public: 16 virtual void Show() = 0; 17 }; 18 19 class ProductA : public Product 20 { 21 public: 22 void Show() 23 { 24 cout<<"I'm ProductA"<<endl; 25 } 26 }; 27 28 class ProductB : public Product 29 { 30 public: 31 void Show() 32 { 33 cout<<"I'm ProductB"<<endl; 34 } 35 }; 36 37 class ProductC : public Product 38 { 39 public: 40 void Show() 41 { 42 cout<<"I'm ProductC"<<endl; 43 } 44 }; 45 46 // Here is the Factory class 47 class Factory 48 { 49 public: 50 Product* CreateProduct(PRODUCTTYPE type) 51 { 52 switch (type) 53 { 54 case TypeA: 55 return new ProductA(); 56 57 case TypeB: 58 return new ProductB(); 59 60 case TypeC: 61 return new ProductC(); 62 63 default: 64 return NULL; 65 } 66 } 67 }; 68 69 int main(int argc, char *argv[]) 70 { 71 // First, create a factory object 72 Factory *ProductFactory = new Factory(); 73 Product *productObjA = ProductFactory->CreateProduct(TypeA); 74 if (productObjA != NULL) 75 productObjA->Show(); 76 77 Product *productObjB = ProductFactory->CreateProduct(TypeB); 78 if (productObjB != NULL) 79 productObjB->Show(); 80 81 Product *productObjC = ProductFactory->CreateProduct(TypeC); 82 if (productObjC != NULL) 83 productObjC->Show(); 84 85 delete ProductFactory; 86 ProductFactory = NULL; 87 88 delete productObjA; 89 productObjA = NULL; 90 91 delete productObjB; 92 productObjB = NULL; 93 94 delete productObjC; 95 productObjC = NULL; 96 97 return 0; 98 }
