| 概念 | 定義 | 例子 |
| 產品等級結構 | 同類產品的繼承體系 | 抽象電視機 → 海爾/創維/TCL電視機 |
| 產品族 | 不同等級結構中、邏輯相關的產品組合 | 海爾電視機 + 海爾冰箱 + 海爾空調 = 海爾產品族 |
關鍵點:一個工廠(如海爾工廠)負責創建一個產品族中的所有產品(各等級結構各一個)。
案例:跨平台代碼比較工具
需求:Windows/Linux 平台下,比較 Cpp/Java 兩種語言代碼。
產品等級結構:CppCodeStyle(Windows/Linux 實現)、JavaCodeStyle(Windows/Linux 實現)。
產品族:WindowsCpp + WindowsJava、LinuxCpp + LinuxJava。
簡單工廠的缺陷
若用兩個獨立工廠 CppFactory、JavaFactory,客戶端可任意組合:
CppCodeStyle* cpp = CppFactory::Create("Windows");
JavaCodeStyle* java = JavaFactory::Create("Linux"); // 錯誤組合!
這違背了「平台一致性」業務規則。
抽象工廠模式結構
// 抽象產品
class CppCodeStyle { virtual void compare() = 0; };
class JavaCodeStyle { virtual void compare() = 0; };
// 具體產品
class WindowsCpp : public CppCodeStyle { void compare() { ... } };
class LinuxCpp : public CppCodeStyle { void compare() { ... } };
class WindowsJava : public JavaCodeStyle { void compare() { ... } };
class LinuxJava : public JavaCodeStyle { void compare() { ... } };
// 抽象工廠
class CodeStyleFactory {
public:
virtual CppCodeStyle* createCpp() = 0;
virtual JavaCodeStyle* createJava() = 0;
};
// 具體工廠(每個工廠對應一個產品族)
class WindowsFactory : public CodeStyleFactory {
CppCodeStyle* createCpp() { return new WindowsCpp(); }
JavaCodeStyle* createJava() { return new WindowsJava(); }
};
class LinuxFactory : public CodeStyleFactory {
CppCodeStyle* createCpp() { return new LinuxCpp(); }
JavaCodeStyle* createJava() { return new LinuxJava(); }
};
// 客戶端使用
void client(CodeStyleFactory* factory) {
CppCodeStyle* cpp = factory->createCpp();
JavaCodeStyle* java = factory->createJava();
// 保證 cpp 和 java 同屬一個平台
}
模式優勢
- 封裝產品族創建邏輯:客戶端無需知道具體類名
- 強制一致性:同一工廠創建的產品必然屬於同一族
- 易於擴展新族:添加 MacFactory 只需新增類,不修改現有代碼(開閉原則)
- 難以擴展新等級:若需添加 PythonCodeStyle,需修改抽象工廠接口及所有具體工廠(缺點)
適用場景
- 系統有多個產品族,每次只使用其中一族
- 產品之間有強依賴/一致性要求
- 提供產品庫,只暴露接口不暴露實現
對比總結
| 模式 | 產品等級數 | 工廠等級數 | 創建責任 |
| 簡單工廠 | 1 | 1 | 單一類集中創建 |
| 工廠方法 | 1 | 多 | 每個具體工廠創建一個產品 |
| 抽象工廠 | 多 | 多 | 每個具體工廠創建一族產品 |
抽象工廠是工廠模式中最抽象、最通用的形式,通過「工廠對象」統一管理「產品族」創建,是大型系統模塊解耦的關鍵模式之一。
- 上一篇文章: LightOJ 1038 Race to 1 Again:期望 DP + 方程變形求解
- 下一篇文章: 二階段提交協議(2PC)在高併發分布式轉賬系統中的工程實踐
Copyright ©
程式碼之家 All Rights Reserved