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

C++ 設計模式深度解析:抽象工廠模式

     編輯:關於C語言

問題背景:從工廠方法到抽象工廠的演進

在先前介紹的工廠方法模式中,每個具體工廠僅負責創建單一類型的產品。隨著業務擴展,產品族群日益豐富,若仍沿用工廠方法模式,將導致工廠類別數量激增,管理維護成本大幅上升。例如某顯示器廠商,原有工廠 A、B 分別生產非液晶與液晶電路板;後因業務擴展需生產顯示器其餘部件,若另建工廠 C、D,不僅增加廠房成本,更造成技術經驗無法複用、管理分散等弊端。

此時,抽象工廠模式應運而生——它將「生產同一產品族的多條生產線」整合至同一工廠,實現相關產品族的統一創建,既降低耦合,又提升擴展性與維護性。

UML 類圖解析

抽象工廠模式 UML 類圖

圖中核心角色:

  • AbstractFactory:抽象工廠介面,宣告創建各類產品的工廠方法
  • ConcreteFactory1/2:具體工廠,實現具體產品的創建邏輯
  • AbstractProductA/B:抽象產品介面
  • ProductA1/A2, ProductB1/B2:具體產品實現

抽象工廠模式可視為多個工廠方法模式的疊加,每個具體工廠內部包含多條「生產線」(工廠方法),負責創建一組相關/依賴的產品對象。

適用場景

  • 系統需創建多個相關聯的產品族,而非單一產品
  • 產品結構複雜,具有多個抽象角色(如不同系列的 UI 組件、不同資料庫的驅動程式等)
  • 希望統一管理產品族的創建邏輯,確保客戶端始終使用同一族群的產品

核心代碼實現

/* Abstract Factory Pattern Demo */
#include <iostream>
using namespace std;

// 抽象產品 A
class ProductA { public: virtual void Show() = 0; };
class ProductA1 : public ProductA { public: void Show() override { cout << "I'm ProductA1" << endl; } };
class ProductA2 : public ProductA { public: void Show() override { cout << "I'm ProductA2" << endl; } };

// 抽象產品 B
class ProductB { public: virtual void Show() = 0; };
class ProductB1 : public ProductB { public: void Show() override { cout << "I'm ProductB1" << endl; } };
class ProductB2 : public ProductB { public: void Show() override { cout << "I'm ProductB2" << endl; } };

// 抽象工廠
class Factory { public: virtual ProductA* CreateProductA() = 0; virtual ProductB* CreateProductB() = 0; };

// 具體工廠 1:生產系列 1 產品
class Factory1 : public Factory {
public:
    ProductA* CreateProductA() override { return new ProductA1(); }
    ProductB* CreateProductB() override { return new ProductB1(); }
};

// 具體工廠 2:生產系列 2 產品
class Factory2 : public Factory {
public:
    ProductA* CreateProductA() override { return new ProductA2(); }
    ProductB* CreateProductB() override { return new ProductB2(); }
};

int main() {
    // 使用工廠 1 創建系列 1 產品族
    Factory* factory1 = new Factory1();
    ProductA* pa1 = factory1->CreateProductA();
    ProductB* pb1 = factory1->CreateProductB();
    pa1->Show(); pb1->Show();

    // 使用工廠 2 創建系列 2 產品族
    Factory* factory2 = new Factory2();
    ProductA* pa2 = factory2->CreateProductA();
    ProductB* pb2 = factory2->CreateProductB();
    pa2->Show(); pb2->Show();

    // 資源釋放
    delete pa1; delete pb1; delete factory1;
    delete pa2; delete pb2; delete factory2;
    return 0;
}

模式優勢總結

  1. 封裝性:將具體產品的創建細節封裝於具體工廠內部,客戶端無需知曉實例化邏輯
  2. 一致性:確保客戶端始終使用同一產品族的對象,避免跨族群混用導致的不相容問題
  3. 擴展性:新增產品族僅需新增具體工廠與對應產品類,符合開閉原則
  4. 維護性:集中管理相關產品的創建邏輯,減少分散的工廠類別
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved