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

設計模式精講(三):抽象工廠模式——產品族的統一創建介面

     編輯:關於C語言

模式意圖

提供一個介面,讓用戶端在不指定具體類別的情況下,創建一組「相關或相依」的物件(即產品族)。

解決的核心問題

  • 系統需支援多組「風格一致」的產品(如:Windows/Linux/Mac 風格的按鈕、視窗、捲軸)。
  • 用戶端程式碼不應硬編碼具體產品類別,否則切換風格需大幅修改。
  • 確保同一族群的產品協同工作(不會混搭 Windows 按鈕 + Mac 視窗)。

適用場景

  1. 系統有多個產品族,每次只使用其中一族。
  2. 產品之間有相依/約束關係,必須成套創建。
  3. 想將具體實現與用戶端解耦,支援執行期切換族群(如換膚、跨平台 UI)。

結構圖解

+----------------+       +---------------------+
| AbstractFactory|◄──────| ConcreteFactory1  │  (WinFactory)
| +createButton()|       | +createButton()    │
| +createWindow()|       | +createWindow()    │
+----------------+       +---------------------+
        ▲                         ▲
        │                         │
        │         +---------------------+
        └────────►| ConcreteFactory2  │  (MacFactory)
                  | +createButton()    │
                  | +createWindow()    │
                  +---------------------+

AbstractProductA (Button) ◄── WinButton, MacButton
AbstractProductB (Window) ◄── WinWindow, MacWindow

關鍵代碼骨架 (C++17)

// 抽象產品
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

生活化類比

衣櫃 = 具體工廠,成套服裝 = 產品族:

  • 商務衣櫃 → 西裝上衣 + 西裝褲 + 風衣(商務族)
  • 休閒衣櫃 → T恤 + 牛仔褲 + 衛衣(休閒族)
  • 你不會從商務衣櫃拿 T恤、從休閒衣櫃拿西裝褲 → 工廠保證族群一致性。

優缺點權衡

優點缺點
1. 隔離具體類別,用戶端零依賴 1. 新增產品等級極難:需修改抽象工廠介面、所有具體工廠、所有用戶端
2. 強制同族產品協同,避免混搭 2. 類別數量膨脹(每族每等級一類)
3. 支援執行期熱插拔工廠實例 3. 若產品族僅單一產品,退化為工廠方法,過度設計

經典應用實例

  1. 跨平台 GUI 庫:SWT、Qt 風格插件、Java AWT `Toolkit` 抽象工廠。
  2. 資料庫驅動:`Connection`、`Statement`、`ResultSet` 為產品族,`Driver` 為工廠(JDBC `DriverManager` 扮演工廠的工廠)。
  3. 遊戲陣營單位:人族/獸族/神族各自的兵營、農民、戰士形成族群。
  4. 主題換膚:淺色/深色/高對比度主題 → 各自的按鈕、面板、字型。

使用注意事項

  • 產品等級易擴展,產品族難擴展:新增「工具提示」產品等級 → 只需在抽象工廠加 `createTooltip()`,各具體工廠實作即可,不動用戶端。
  • 若產品族固定、等級常變 → 改用建造者模式或原型模式。
  • 依賴注入容器(Spring `@Autowired`、`std::unique_ptr` 工廠參數)可進一步解耦工廠選擇邏輯。

抽象工廠是「產品族一致性」的守門員。記住:族固定、等級變 → 抽象工廠適合;族常變、等級固定 → 別用它。

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