簡單工廠模式

咱們先來看看一個簡單的計算機案例(一個控制檯應用程序):

Operation是一個運算類,加減乘除方法繼承於Operation。

 

  1.  /// <summary>  
  2. /// 運算類  
  3. /// </summary>  
  4. abstract public class Operation  
  5. {  
  6.     public double NumberA { getset; }  
  7.   
  8.     public double NumberB { getset; }  
  9.   
  10.     public abstract double GetResult();  
  11. }  

 

  1. /// <summary>  
  2. /// 加法類  
  3. /// </summary>  
  4. public class OperationAdd:Operation  
  5. {  
  6.     public override double GetResult()  
  7.     {  
  8.         return base.NumberA + base.NumberB;  
  9.     }  
  10. }  

 

減法,乘法,除法類似,在此不列出。

 

在這裏就有一個問題了,我們怎麼讓程序知道我們到底是要執行哪一種運算呢?也就是如何去實例化對象的問題

在這裏到底要實例化誰,將來會不會增加這實例化的對象,比如增加開根運算,這是很容易變化的地方,

應該考慮用一個單獨的類做這個創造實例的過程,這就是工廠。下面我們就引入簡單工廠:

  1. public class OperationFaction  
  2.     {  
  3.         public static Operation createOperation(string operate)  
  4.         {  
  5.             Operation oper = null;  
  6.             switch (operate)  
  7.             {  
  8.                 case "+":  
  9.                     oper = new OperationAdd();  
  10.                     break;  
  11.                 case "-":  
  12.                     oper = new OperationSub();  
  13.                     break;  
  14.                 case "*":  
  15.                     oper = new OperationMul();  
  16.                     break;  
  17.                 case "/":  
  18.                     oper = new OperationDiv();  
  19.                     break;  
  20.             }  
  21.             return oper;  
  22.         }  
  23.     }  


工廠方法通常是一個靜態方法,因此又叫靜態工廠方法模式,這個方法返回的類型爲通用的父類類型,但是new的是具體的子類類型。

在這裏我們只需要輸入運算符號,工廠就實例化出合適的對象,通過多態,返回的父類的方式實現了計算器的計算。

 

客戶端代碼:

  1. class Program  
  2.     {  
  3.         static void Main(string[] args)  
  4.         {  
  5.             Operation oper = null;  
  6.             oper = OperationFaction.createOperation("+");  
  7.             oper.NumberA = 10;  
  8.             oper.NumberB = 12;  
  9.             double result = oper.GetResult();  
  10.             Console.WriteLine("運行結果爲:"+result);  
  11.         }  
  12.     }  

當我們需要增加各種運算,比如平方根,立方根等的時候,我們只需要添加相應的運算子類,和在工廠類中添加一個分支就可以了。

 

我們再來看看總體的UML圖:

下面我們再來詳細的分析一下簡單工廠:

優點:

簡單工廠中“工廠類”是整個模式的關鍵,包含了必要的邏輯判斷,根據外界給定的信息,決定究竟應該創建哪個具體類的對象.

通過使用工廠類,外界可以從直接創建具體產品對象的尷尬局面擺脫出來,僅僅需要負責“消費”對象就可以了。

而不必管這些對象究竟如何創建及如何組織的.明確了各自的職責和權利,有利於整個軟件體系結構的優化。

缺點:

簡單工廠不符合開放-封閉原則,簡單工廠在對每一次擴展時都要更改工廠類,這就是對修改開放了,這就不符合開閉原則。

當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件創建不同實例的需求.

這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統的維護和擴展也非常不利;

工廠類集中了所有實例的創建邏輯,違反了高內聚責任分配原則,將全部創建邏輯集中到了一個工廠類中,這樣對於維護非常不方便。

簡單工廠應用場景:

工廠類負責創建的對象比較少;
客戶只知道傳入工廠類的參數,對於如何創建對象(邏輯)不關心;
由於簡單工廠很容易違反高內聚責任分配原則,因此一般只在很簡單的情況下應用。

以上內容轉自:http://blog.csdn.net/shiyuan17/article/details/9047917
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章