定義
百度文庫:簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。
標准定義:簡單工廠模式(Simple Factory Pattern)屬於類的創新型模式,又叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
基本簡介
簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一類產品(這些產品繼承自一個產品的父類或者接口)的實例,該模式包含的角色和職責。
(1)工廠(Creator)角色
簡單工廠模式的核心,他負責實現創建所有實例的內部邏輯。工廠類的創建產品類方法可以直接被外界調用,創建所需的產品對象。
(2)抽象產品(Product)角色
簡單工廠模式所創建所有對象的父類,他負責描述所有實例所共有的公共接口。
(3)具體產品(Concrete Product)角色
簡單工廠模式的創建目標,所有創建的對象都是充當這個角色某個具體類的實例。
UML圖
示例1
抽象產品的簡單工廠
(1.1)抽象產品
/// <summary> /// 抽象產品 /// </summary> public abstract class Product { public abstract void Create(); }
(1.2)具體產品ProductA,ProductB
/// <summary> /// 具體產品A /// </summary> public class ProductA : Product { public override void Create() { Console.WriteLine("create product_A"); } } /// <summary> /// 具體產品B /// </summary> public class ProductB : Product { public override void Create() { Console.WriteLine("create product_B"); } }
(1.3)工廠創建
/// <summary> /// 工廠類,根據參數判斷創建何種實例 /// </summary> public class CreateFactory { public static Product InstanceCreater(string type) { switch (type) { case "ProductA": return new ProductA(); case "ProductB": return new ProductB(); default: throw new NotImplementedException(); } } }
(1.4)實例調用
Product product = CreateFactory.InstanceCreater("ProductA");
示例2
(2.1)概念產品計算器類
/// <summary> /// 計算類 /// </summary> public class Operation { /// <summary> /// 數字A /// </summary> public double NumberA { get; set; } /// <summary> /// 數字B /// </summary> public double NumberB { get; set; } /// <summary> /// 得到運算結果 /// </summary> /// <returns></returns> public virtual double CalcResult() { double result = 0; return result; } }
(2.2)具體操作eg:加法,減法
/// <summary> /// 加法類 /// </summary> public class OperationAdd : Operation { public override double CalcResult() { double result = 0; result = NumberA + NumberB; return result; } } /// <summary> /// 減法類 /// </summary> public class OperationSub : Operation { public override double CalcResult() { double result = 0; result = NumberA - NumberB; return result; } }
(2.3)工廠計算器方法
/// <summary> /// 工廠計算方法類 /// </summary> public class OperationFactory { public static Operation GetOperationInstance(string operate) { Operation opera = null; switch (operate) { case "+": opera = new OperationAdd(); break; case "-": opera = new OperationSub(); break; default: throw new NotImplementedException(); } return opera; } }
(2.4)調用
Operation operation = OperationFactory.GetOperationInstance("+"); operation.NumberA = 10; operation.NumberB = 10; Console.WriteLine(operation.CalcResult());
深入分析
簡單工廠解決的問題是如何如何去實例化一個合適的對象
簡單工廠核心思想有一個專門的類負責創建實例的過程
具體來說把產品看成一系列類的集合,這些類是由某個抽象類或者接口派生出來的一個對象樹,而工廠類用來產生一個合適的對象滿足客戶的需求。如果簡單工廠模式所涉及的具體產品之間沒有共同的邏輯,那么我們就可以使用接口來扮演抽象產品的角色,如果具體產品之間有相似的功能或邏輯,我們就把這些相似的邏輯提取出來放到抽象類中。然后具體產品繼承抽象類,為了實現更好的復用,共同或者重復的東西應該抽象出來。
優缺點
(1)優點
工廠類是整個模式的關鍵所在,它包含必要的判斷邏輯,能夠根據外界的指定條件實例化相應具體產品,用戶在使用時可以直接根據工廠類創建所需要的實例,無需了解對象是如何創建以及如何組織的。有利於軟件結構體系優化。
(2)缺點
由於工廠類集中了所有類的創建邏輯,這就導致一旦這個工廠出現問題,所有的客戶端都收到牽連。由於簡單工廠模式的產品基於一個共同的抽象類后者接口,這樣一來,當產品種類增加的時候
總結:
簡單工廠模式分離產品的創建者和消費者,有利於軟件系統的機構化;但猶豫一切邏輯都集中在工廠類中,導致了沒有很高的內聚性,同時也違背了開放封閉原則。另外,簡單工廠模式的方法一般是靜態的,而靜態工廠方法是無法讓子類繼承的,因此簡單工廠無法形成基於基類的繼承樹結構。