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

大話設計模式學習筆記:簡單工廠模式 C++ 實作與 UML 解析

     編輯:關於C語言

簡單工廠模式屬創建型模式,由一個工廠類別根據參數決定具體產品類別的實例化。本文以計算機為例,展示 C++ 實作、UML 類別圖對應、擴展性分析與現代 C++ 改良建議 (智慧指標、註冊表模式)。

模式角色對應

角色類別職責
Product (抽象產品)Operation定義 GetResult() 純虛函數
ConcreteProductOperationAdd, OperationSub, OperationMul, OperationDiv具體運算實作
FactoryOperationFactorycreateOperation(char) 靜態工廠方法

C++ 核心實作

#include <iostream>
#include <memory>      // unique_ptr
#include <limits>      // numeric_limits
using namespace std;

// 抽象產品
class Operation {
public:
    virtual ~Operation() = default;
    double numA = 0, numB = 0;
    virtual double GetResult() const = 0;
};

// 具體產品
class OperationAdd : public Operation {
public:
    double GetResult() const override { return numA + numB; }
};
class OperationSub : public Operation {
public:
    double GetResult() const override { return numA - numB; }
};
class OperationMul : public Operation {
public:
    double GetResult() const override { return numA * numB; }
};
class OperationDiv : public Operation {
public:
    double GetResult() const override {
        return (numB == 0) ? numeric_limits<double>::max() : numA / numB;
    }
};

// 簡單工廠
class OperationFactory {
public:
    static unique_ptr<Operation> Create(char op) {
        switch (op) {
            case '+': return make_unique<OperationAdd>();
            case '-': return make_unique<OperationSub>();
            case '*': return make_unique<OperationMul>();
            case '/': return make_unique<OperationDiv>();
            default:  return nullptr;
        }
    }
};

客戶端使用


int main() {
    double a, b; char op;
    cout << "輸入運算式 (如 3 + 4):";
    cin >> a >> op >> b;

    auto oper = OperationFactory::Create(op);
    if (!oper) { cerr << "不支援的運算子\n"; return 1; }

    oper->numA = a; oper->numB = b;
    cout << "結果:" << oper->GetResult() << endl;
    return 0;  // unique_ptr 自動釋放
}

UML 類別圖 (文字版)

+----------------+       +---------------------+
|   Operation    |<------|  OperationFactory   |
|----------------|       |---------------------|
| +numA: double  |       | +Create(char):      |
| +numB: double  |       |   unique_ptr    |
| +GetResult()=0 |       +---------------------+
+-------^--------+
        |
  +-----+-----+-----+-----+
  |     |     |     |     |
 Add  Sub   Mul   Div   (擴充)

優缺點分析

優點缺點
客戶端解耦具體類別,只依賴抽象介面 工廠類別集中所有建立邏輯,違反開放封閉原則 (OCP)
單一職責:建立邏輯集中管理 新增產品需修改工廠 switch,重新編譯部署
簡單易懂,適合產品數量固定/較少場景 靜態工廠方法難以支援參數化建構

現代 C++ 改良方向

  1. 智慧指標:回傳 unique_ptr 明確所有權,避免記憶體洩漏。
  2. 註冊表模式:產品類別靜態註冊至 map<string, creator_func>,新增產品零修改工廠原始碼。
  3. 參數化建構:工廠方法接受 std::any 或 variant 參數包,轉發至建構子。

適用場景

  • 產品種類較少、固定,客戶端不需知道具體類別名稱。
  • 建立邏輯單純 (單純 new),無複雜初始化依賴。
  • 作為工廠方法模式、抽象工廠模式的學習入門基石。

總結

簡單工廠模式以「集中建立、介面解耦」為核心價值。掌握其結構後,理解為何需進化為「工廠方法」 (去中心化建立) 與「抽象工廠」 (產品族建立),即可建立完整創建型模式知識體系。現代 C++ 實作請善用 unique_ptr、make_unique 與註冊表模式提升擴展性與安全性。

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