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

C# 設計模式:抽象工廠模式深度解析(七)— 組態檔驅動工廠切換

     編輯:關於C語言

從簡單工廠到抽象工廠的演進

前文引入 Factory 類別解決客戶端直接 new 具體類別的問題,但移植時仍需修改 Factory 源碼(將 ChineseTax 改為 AmericanTax),工作量未減少且違反 OCP。

抽象工廠 + 組態檔:將移植工作轉移至設定檔

新增 AbstractFactory 抽象基類,提供靜態 GetInstance() 根據組態檔 factoryName 動態決定實例化哪個具體工廠:

抽象工廠代碼

public abstract class AbstractFactory
{
    public static AbstractFactory GetInstance()
    {
        string factoryName = Constant.STR_FACTORYNAME; // 從 App.config/Web.config 讀取

        AbstractFactory instance = null;
        if (factoryName == "ChineseFactory")
            instance = new ChineseFactory();
        else if (factoryName == "AmericanFactory")
            instance = new AmericanFactory();

        return instance;
    }

    public abstract Tax CreateTax();
    public abstract Bonus CreateBonus();
}

具體工廠實作

public class ChineseFactory : AbstractFactory
{
    public override Tax CreateTax() => new ChineseTax();
    public override Bonus CreateBonus() => new ChineseBonus();
}

public class AmericanFactory : AbstractFactory
{
    public override Tax CreateTax() => new AmericanTax();
    public override Bonus CreateBonus() => new AmericanBonus();
}

組態檔設定

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="factoryName" value="AmericanFactory" />
  </appSettings>
</configuration>

架構優勢

  • 系統在中美企業間切換,**零代碼修改**,僅改組態檔
  • 移植文檔極簡單:給 Hippo 公司一份組態檔說明即可
  • 客戶端 Calculator 完全不變,持續依賴抽象介面

遺留問題預告

若新增日本廠商,仍需修改 AbstractFactory.GetInstance() 加入 else if。下一集將引入反射機制徹底解決此問題。

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