首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 設計模式深度解析:抽象工廠模式

     編輯:關於C#

一、核心意圖:應對「多系列對象創建」的變化

軟件系統常面臨「一系列相互依賴對象」的創建,且因需求變化存在多個系列。抽象工廠模式提供一個創建相關/依賴對象族的介面,無需指定具體類,通過「封裝機制」避免客戶程序與多系列具體對象創建緊耦合。

二、邏輯與物理模型

邏輯模型

物理模型

三、生活原型:汽車沖壓設備

同一沖壓機通過換模具生產不同車型的車門、擋泥板、引擎蓋等。模具即具體工廠,沖壓機即抽象工廠,車身部件即產品族。三分鐘換模實現產品族切換。

汽車沖壓設備

四、虛擬案例演進:薪資計算系統

初始:僅支持中國企業

工資 = 基本工資(4000) + 獎金 - 個稅。中國規則:獎金=基本工資×10%,個稅=(基本工資+獎金)×40%。

中國企業模型

擴展:支持美國企業

美規則:獎金=基本工資×15%,個稅=(基本工資×5%+獎金×25%)。直接修改類名導致每次切換都要改代碼、重編譯。

美國企業模型

整合:保留所有業務規則

保留中美兩套實現,Calculator 僅修改實例化代碼。但仍需修改 Calculator 源碼,若無源碼(如外包給 Hippo 公司)則無法移植。

整合模型

引入工廠類

提取創建邏輯到 Factory,Calculator 依賴 Factory。切換系列只需改 Factory。但 Factory 仍需修改源碼。

public class Factory {
    public Tax CreateTax() { return new ChineseTax(); }
    public Bonus CreateBonus() { return new ChineseBonus(); }
}

抽象工廠終極方案

定義抽象工廠介面,具體工廠實現;配置文件指定工廠名,反射動態實例化。移植僅需改配置文件,無需改代碼、無需源碼。

介面模型

最終模型

public abstract class AbstractFactory {
    public static AbstractFactory GetInstance() {
        string factoryName = Constant.STR_FACTORYNAME; // 從配置讀取
        if (factoryName != "") 
            return (AbstractFactory)Assembly.Load(factoryName).CreateInstance(factoryName);
        return null;
    }
    public abstract Tax CreateTax();
    public abstract Bonus CreateBonus();
}

配置文件:

<appSettings>
  <add key="factoryName" value="AmericanFactory" />
</appSettings>

新增日本系列:僅添加 JapaneseTax/JapaneseBonus 及 JapaneseFactory,無需動 AbstractFactory 代碼,完美符合開閉原則。

五、實現要點與優缺點

要點:

  • 產品創建延遲到具體工廠子類。
  • 無「多系列」變化時,簡單靜態工廠足矣。
  • 系列對象指相互依賴/作用的對象(如遊戲場景中道路與房屋)。
  • 常與工廠方法模式結合應對創建變化。
  • 具體工廠通常實現為單例。
  • 每個產品定義一個工廠方法,具體工廠重定義指定產品。

優點: 分離具體類、易交換產品系列、保證產品族一致性。

缺點: 難支持「新產品」(需擴展工廠介面,涉及所有子類修改)。

六、適用性與應用場景

  • 系統不應依賴產品創建/組合/表達細節。
  • 多產品族,系統只消費其中一族。
  • 同族產品需配套使用,設計須體現此約束。
  • 提供產品庫,統一介面對外。

場景: 多觀感標準 UI 工具箱、遊戲多風格場景(道路/房屋/管道)等。

七、總結

抽象工廠模式核心在於應對「多系列對象創建」變化。徹底理解它,是面向對象設計理解躍升的里程碑——你將掌握 OOP 精髓:面向介面編程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved