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

C++ 設計模式精講:工廠方法模式

     編輯:關於C語言

痛點:簡單工廠的擴展困境

簡單工廠模式將所有產品創建邏輯集中在單一工廠類的 switch-case 中。當需新增產品類型(如 ProductD)時,必須修改工廠類源碼、重新編譯測試,違反開閉原則,且測試成本高昂。工廠方法模式正是為解決此問題而生。

核心思想:將創建權下放給子類

工廠方法模式 UML 類圖

  • Factory:抽象工廠,宣告工廠方法 CreateProduct()
  • FactoryA/FactoryB:具體工廠,各自實現創建對應產品的邏輯
  • Product:抽象產品介面
  • ProductA/ProductB:具體產品實現

關鍵在於:核心工廠類不再負責具體產品創建,僅定義介面;具體創建工作延遲到子類執行。新增產品時,只需新增對應的具體工廠與產品類,完全不動原有代碼。

適用場景

  1. 設計初期預判產品類型會頻繁擴展
  2. 產品結構複雜,創建邏輯不宜集中在單一類中
  3. 希望將產品創建與使用解耦,實現單元測試的隔離性

完整代碼示例

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

// 抽象產品
class Product { public: virtual void Show() = 0; virtual ~Product() = default; };
class ProductA : public Product { public: void Show() override { cout << "I'm ProductA" << endl; } };
class ProductB : public Product { public: void Show() override { cout << "I'm ProductB" << endl; } };

// 抽象工廠
class Factory { public: virtual Product* CreateProduct() = 0; virtual ~Factory() = default; };

// 具體工廠 A
class FactoryA : public Factory {
public: Product* CreateProduct() override { return new ProductA(); }
};

// 具體工廠 B
class FactoryB : public Factory {
public: Product* CreateProduct() override { return new ProductB(); }
};

int main() {
    Factory* factoryA = new FactoryA();
    Product* productA = factoryA->CreateProduct();
    productA->Show();

    Factory* factoryB = new FactoryB();
    Product* productB = factoryB->CreateProduct();
    productB->Show();

    delete productA; delete factoryA;
    delete productB; delete factoryB;
    return 0;
}

與簡單工廠的關鍵差異

維度簡單工廠工廠方法
擴展新產品修改工廠類源碼新增具體工廠類
測試影響範圍全量回歸測試僅測試新增工廠與產品
符合開閉原則否是
適用產品數量少、固定多、可擴展
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved