提供一個介面,讓用戶端在不指定具體類別的情況下,創建一組「相關或相依」的物件(即產品族)。
+----------------+ +---------------------+
| AbstractFactory|◄──────| ConcreteFactory1 │ (WinFactory)
| +createButton()| | +createButton() │
| +createWindow()| | +createWindow() │
+----------------+ +---------------------+
▲ ▲
│ │
│ +---------------------+
└────────►| ConcreteFactory2 │ (MacFactory)
| +createButton() │
| +createWindow() │
+---------------------+
AbstractProductA (Button) ◄── WinButton, MacButton
AbstractProductB (Window) ◄── WinWindow, MacWindow
// 抽象產品
struct Button { virtual void paint() = 0; virtual ~Button() = default; };
struct Window { virtual void render() = 0; virtual ~Window() = default; };
// 具體產品 (Windows 風格)
struct WinButton : Button { void paint() override { puts("WinButton"); } };
struct WinWindow : Window { void render() override { puts("WinWindow"); } };
// 具體產品 (Mac 風格)
struct MacButton : Button { void paint() override { puts("MacButton"); } };
struct MacWindow : Window { void render() override { puts("MacWindow"); } };
// 抽象工廠
struct GUIFactory {
virtual std::unique_ptr
衣櫃 = 具體工廠,成套服裝 = 產品族:
| 優點 | 缺點 |
|---|---|
| 1. 隔離具體類別,用戶端零依賴 | 1. 新增產品等級極難:需修改抽象工廠介面、所有具體工廠、所有用戶端 |
| 2. 強制同族產品協同,避免混搭 | 2. 類別數量膨脹(每族每等級一類) |
| 3. 支援執行期熱插拔工廠實例 | 3. 若產品族僅單一產品,退化為工廠方法,過度設計 |
抽象工廠是「產品族一致性」的守門員。記住:族固定、等級變 → 抽象工廠適合;族常變、等級固定 → 別用它。