定義
百度文庫:簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(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)缺點
由於工廠類集中了所有類的創建邏輯,這就導致一旦這個工廠出現問題,所有的客戶端都收到牽連。由於簡單工廠模式的產品基於一個共同的抽象類后者接口,這樣一來,當產品種類增加的時候
總結:
簡單工廠模式分離產品的創建者和消費者,有利於軟件系統的機構化;但猶豫一切邏輯都集中在工廠類中,導致了沒有很高的內聚性,同時也違背了開放封閉原則。另外,簡單工廠模式的方法一般是靜態的,而靜態工廠方法是無法讓子類繼承的,因此簡單工廠無法形成基於基類的繼承樹結構。
