在面向對象編程(OOP)的世界中,簡單工廠模式(Simple Factory Pattern) 是一種非常常見且實用的設計模式。雖然它并不屬于GoF(Gang of Four)定義的23種經典設計模式之一,但它是理解更復雜模式(如工廠方法模式)的重要鋪墊。本文將深入解析簡單工廠模式的工作原理、實現方式及其在實際項目中的作用。
一、什么是簡單工廠模式?
簡單工廠模式是一種創建型設計模式,它的核心思想是:根據輸入的參數或條件,返回一個特定類的實例。這些類通常繼承自同一個基類或接口,具有相同的方法簽名,但方法的具體實現可能不同。
簡單工廠模式通過一個“工廠”類來封裝對象的創建邏輯,使得客戶端無需關心具體的對象創建過程,只需要調用工廠提供的接口即可獲取所需對象。
二、簡單工廠模式的結構解析
我們通過一個類圖來理解簡單工廠模式的核心組成部分:
- 基類(Base Class):定義了所有子類共有的接口。
- 具體類(Concrete Classes):繼承自基類,實現具體的業務邏輯。
- 工廠類(Factory Class):根據傳入的參數決定返回哪一個具體類的實例。
以一個名字解析器為例,假設我們有如下類結構:
Namer
:基類,提供基礎屬性和方法。FirstFirst
:表示“firstname lastname”格式。LastFirst
:表示“lastname, firstname”格式。NamerFactory
:簡單工廠類,根據輸入判斷使用哪個具體類解析名字。
三、一個C#示例:名字解析器
1. 定義基類 Namer
public class Namer
{protected string frName, lName;public string GetFrname(){return frName;}public string GetLname(){return lName;}
}
該類定義了兩個受保護的字段 frName
和 lName
,并提供公共方法來獲取它們。
2. 實現具體類 FirstFirst
和 LastFirst
FirstFirst
類處理“firstname lastname”格式:
public class FirstFirst : Namer
{public FirstFirst(string name){int i = name.Trim().IndexOf(" ");if (i > 0){frName = name.Substring(0, i).Trim();lName = name.Substring(i + 1).Trim();}else{lName = name;frName = "";}}
}
LastFirst
類處理“lastname, firstname”格式:
public class LastFirst : Namer
{public LastFirst(string name){int i = name.IndexOf(",");if (i > 0){lName = name.Substring(0, i);frName = name.Substring(i + 1).Trim();}else{lName = name;frName = "";}}
}
這兩個派生類都通過構造函數對傳入的字符串進行解析,并將結果保存在基類字段中。
3. 構建簡單工廠類 NamerFactory
public class NamerFactory
{public Namer CreateNamer(string name){if (name.Contains(","))return new LastFirst(name);elsereturn new FirstFirst(name);}
}
工廠類根據輸入是否包含逗號來決定返回哪一個具體類的實例。
4. 客戶端調用示例
class Program
{static void Main(string[] args){NamerFactory factory = new NamerFactory();Namer namer1 = factory.CreateNamer("John Doe");Console.WriteLine($"First Name: {namer1.GetFrname()}, Last Name: {namer1.GetLname()}");Namer namer2 = factory.CreateNamer("Doe, John");Console.WriteLine($"First Name: {namer2.GetFrname()}, Last Name: {namer2.GetLname()}");}
}
輸出結果:
First Name: John, Last Name: Doe
First Name: John, Last Name: Doe
四、簡單工廠模式的優點與局限
? 優點:
- 封裝對象創建邏輯:客戶端不需要關心具體類的創建過程,只需調用工廠接口。
- 提高可擴展性:新增一個具體類只需修改工廠邏輯,而不影響已有代碼。
- 統一接口:所有返回對象都繼承自同一個基類或接口,便于統一調用。
?? 局限:
- 違反開放封閉原則:每次新增一個具體類,都需要修改工廠類的判斷邏輯。
- 不適合大規模擴展:當具體類數量激增時,判斷邏輯會變得復雜且難以維護。
- 不屬于GoF模式:不被廣泛認為是“標準”的設計模式,需謹慎使用。
五、簡單工廠模式的適用場景
- 產品種類有限:適用于需要創建的對象類型不多的場景。
- 簡化客戶端調用:當客戶端不希望處理復雜的對象創建邏輯時。
- 作為工廠方法模式的前奏:為后續引入更高級的工廠方法模式打下基礎。
六、從簡單工廠到工廠方法模式的演進
簡單工廠模式雖然實用,但其“集中決策”的特性限制了它的擴展性。在工廠方法模式中,每個具體類都有自己的工廠類,客戶端通過調用不同的工廠來獲取實例,從而實現對擴展開放、對修改關閉的設計原則。
例如:
public interface INamerFactory
{Namer CreateNamer(string name);
}public class FirstFirstFactory : INamerFactory
{public Namer CreateNamer(string name){return new FirstFirst(name);}
}
這種結構允許系統在不修改現有代碼的情況下靈活擴展新的產品類型。
結語:選擇合適的模式,構建高質量系統
簡單工廠模式作為一個輕量級的設計模式,非常適合在中小型項目或模塊中使用。它可以幫助我們快速實現對象的創建邏輯封裝,提高代碼的可讀性和可維護性。然而,隨著業務邏輯的復雜化和對象種類的增加,我們應考慮向更高級的設計模式(如工廠方法模式、抽象工廠模式)進行演進。
設計模式的本質,不是為了炫技,而是為了更好地組織代碼、提高系統的可維護性與可擴展性。