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

C++ 設計模式入門:簡單工廠模式

     編輯:關於C語言

實戰痛點:分散的 new 操作與異常處理

在開發 Windows 8 閱讀器專案時,電子書頁面包含圖形、圖像、文字等多種內容對象。若在渲染邏輯中直接 new 各類對象,不僅導致創建邏輯分散、難以維護,每個 new 還需配套異常處理,使代碼極其臃腫。此時,簡單工廠模式提供了「專門負責對象創建的類」這一解決思路。

模式結構與 UML

簡單工廠模式 UML 類圖

  • Product:抽象產品基類,定義公共介面 Show()
  • ProductA/B/C:具體產品實現
  • Factory:工廠類,根據枚舉類型創建對應產品實例

工廠類內部封裝 switch-case 創建邏輯,客戶端僅需調用 CreateProduct(type) 即可獲取產品對象,實現創建與使用的分離。

適用場景

  1. 系統需創建的對象種類較多,new 操作分散且雜亂
  2. 希望將對象創建過程封裝,專注於業務邏輯操作
  3. 產品類型相對固定,擴展頻率較低的場景

代碼實現

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

enum class ProductType { TypeA, TypeB, TypeC };

// 抽象產品
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 ProductC : public Product { public: void Show() override { cout << "I'm ProductC" << endl; } };

// 簡單工廠
class Factory {
public:
    Product* CreateProduct(ProductType type) {
        switch (type) {
            case ProductType::TypeA: return new ProductA();
            case ProductType::TypeB: return new ProductB();
            case ProductType::TypeC: return new ProductC();
            default: return nullptr;
        }
    }
};

int main() {
    Factory* factory = new Factory();
    
    Product* pA = factory->CreateProduct(ProductType::TypeA);
    if (pA) pA->Show();
    
    Product* pB = factory->CreateProduct(ProductType::TypeB);
    if (pB) pB->Show();
    
    Product* pC = factory->CreateProduct(ProductType::TypeC);
    if (pC) pC->Show();

    delete factory;
    delete pA; delete pB; delete pC;
    return 0;
}

局限性與演進方向

簡單工廠雖解決了創建集中化問題,但違反開閉原則:新增產品需修改工廠類源碼。此為後續工廠方法模式與抽象工廠模式演進的動力。三者關係:

  • 簡單工廠 → 工廠方法:引入抽象工廠層,將創建權下放子類
  • 工廠方法 → 抽象工廠:將單一產品創建擴展為產品族創建
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved