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


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

工資 = 基本工資(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 精髓:面向介面編程。