當日本 NEC 公司採購系統,需新增 JapaneseTax、JapaneseBonus 實作類別。原架構下,AbstractFactory.GetInstance() 仍需加入 else if (factoryName == "Japanese"),違反開閉原則(OCP):對修改關閉,對擴展開放。
若源碼未提供給移植團隊(如 Hippo 公司),根本無法修改工廠類別,移植工作無法進行。
移除所有硬編碼類別名稱,透過組態檔指定完整類別名稱(含命名空間),利用 Assembly.Load + CreateInstance 動態建立工廠實例:
using System;
using System.Reflection;
namespace AbstractFactory
{
public abstract class AbstractFactory
{
public static AbstractFactory GetInstance()
{
string factoryName = Constant.STR_FACTORYNAME; // 從組態檔讀取
AbstractFactory instance = null;
if (!string.IsNullOrEmpty(factoryName))
{
// 動態載入組件並建立實例,無需修改此代碼
instance = (AbstractFactory)Assembly.Load(factoryName)
.CreateInstance(factoryName);
}
return instance;
}
public abstract Tax CreateTax();
public abstract Bonus CreateBonus();
}
}
Tax、Bonus)溝通Calculator 僅依賴抽象,不知具體實作細節最終版模型中,抽象工廠作為「膠水」串聯業務規則與前端調用,大幅降低模組耦合,提升團隊並行開發效率。徹底理解此模式,是邁向 OOP 精髓——面向介面程式設計的關鍵里程碑。