歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++模板實現的通用工廠方法模式

1.工廠方法(Factory Method)模式

工廠方法模式的意義是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。

工廠方法模式結構示意圖

工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先完全實現‘開-閉 原則’,實現了可擴展。其次更復雜的層次結構,可以應用於產品結果復雜的場合。

工廠方法模式很好用,但在代碼層面上,為每一個產品都編寫一個對應的工廠,這無疑很麻煩,而且不同的Product要寫不同Creator。想想你在寫一個GUI庫,基本控件為Widget類,由其派生下了TextBox,Button,Label等幾十個控件,那你需要為這幾十個控件分別編寫對應的ConcreteCreator。天,這太麻煩了吧!而如果你還要寫一個RPG小游戲,需要從Person類派生下如NPC,Hero,Emeny,Ally等又是十幾個類,而且還要編寫一個對應於Person的Creator....

2.模板實現工廠方法模式

面對這種類型造成的多態,C++模板就要出場了。現在情況是這樣的,Product和ConcreteProduct都已經寫好,我們要為其編寫對應的工廠類。可以看出來,Product對應對Creator,ConcreteProduct對應於ConcreteCreator。也就是說,如果想編寫通用的ConcreteCreator,就得將ConcreteProduct抽象,想編寫通用的Creator,就得將Product抽象。而我們最後會將這2者都抽象了。

首先編寫通用的ConcreteCreator

  1. // 具體工廠類   
  2. // Product為抽象產品,ConcreteProduct為具體產品   
  3. template<typename Product, typename ConcreteProduct>  
  4. class ConcreteCreator  
  5. {  
  6. public:  
  7.     // 生產一個具體產品   
  8.     static Product* createProduct()  
  9.     {  
  10.         return new ConcreteProduct();  
  11.     }  
  12. };  

注意createProduct()是靜態的,是因為該函數要被保存起來的,靜態函數只需保存其函數指針即可,而普通的成員函數還要額外保存一個對象指針,這無疑更麻煩了。 也就是我們不需要這樣用: 

  1. ConcreteCreator<Product, ConcreteProduct> concreteCreator;     
  2. Product* p = concreteCreator.createProduct();  

只需要這樣寫:

  1. Product* p = ConcreteCreator<Product, ConcreteProduct>::createProduct();  
Copyright © Linux教程網 All Rights Reserved