一、引入
簡單工廠模式在開發中應用的情況也非常多,但其并不是GOF二十三種設計模式之一,最多只能算作是工廠方法模式的一種特殊形式,從設計模式的類型上來說,簡單工廠模式是屬于創建型模式,又叫做靜態工廠方法(Static Factory Method)模式。
簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。
二、類圖
下面通過比較直觀的類圖來說明一下
1.首先需要定義一個通用接口IProduct,作為構造實例的類型
2.定義不同的產品類 (Product_A和Product_B),均繼承該接口,并各自實現接口定義的方法
3.構造工廠類,并定義Creator方法(一般是static的),通過Creator的方法參數,在方法體內判斷應該構造哪種類型的對象并返回(返回類型統一為IProduct)
三、代碼結構
由上面的類圖,我們很容易得到類似下面的代碼:
private static void Main(string[] args) { IProduct product1 = Factory.Creator(ProductName.Product_A); product1.BeCreated(); IProduct product2 = Factory.Creator(ProductName.Product_B); product2.BeCreated(); Console.ReadKey(); }
/// <summary> /// 接口 /// </summary> public interface IProduct { void BeCreated(); } /// <summary> /// Product_A類型 /// </summary> public class Product_A : IProduct { public void BeCreated() { Console.WriteLine("Product_A has been created!"); } } /// <summary> /// Product_B類型 /// </summary> public class Product_B : IProduct { public void BeCreated() { Console.WriteLine("Product_B has been created!"); } } /// <summary> /// 簡單工廠類 /// </summary> public class Factory { public static IProduct Creator(ProductName name) { if(name ==ProductName.Product_A) { return new Product_A(); } else if (name == ProductName.Product_B) { return new Product_B(); } else { throw new Exception("Product Name is invalid."); } } } /// <summary> /// 可構造的產品類型的名稱 /// </summary> public enum ProductName { Product_A, Product_B }
簡單工廠模式就像它的名字一樣簡單,總結起來就是一個產品接口,一個實現了產品接口的產品,和一個工廠類,這個工廠類根據要傳入的方法參數去創造一個具體的產品然后轉型為接口類型返回。
四、簡單工廠模式的優缺點
優點:
通過使用工廠類,外界不再需要關心如何創造各種具體的產品,只要提供一個產品的名稱作為參數傳給工廠,就可以直接得到一個想要的產品對象,并且可以按照接口規范來調用產品對象的所有功能(方法)。
構造容易,邏輯簡單。
缺點:
1.細心的朋友可能早就發現了,這么多if else判斷完全是Hard Code啊,如果我有一個新產品要加進來,就要同時添加一個新產品類,并且必須修改工廠類,再加入一個 else if 分支才可以, 這樣就違背了 “開放-關閉原則”中的對修改關閉的準則了。當系統中的具體產品類不斷增多時候,就要不斷的修改工廠類,對系統的維護和擴展不利。那有沒有改進的方法呢?在工廠方法模式中會進行這方面的改進。
2.一個工廠類中集合了所有的類的實例創建邏輯,違反了高內聚的責任分配原則,將全部的創建邏輯都集中到了一個工廠類當中,因此一般只在很簡單的情況下應用,比如當工廠類負責創建的對象比較少時。
文章列表