簡單工廠模式屬創建型模式,由一個工廠類別根據參數決定具體產品類別的實例化。本文以計算機為例,展示 C++ 實作、UML 類別圖對應、擴展性分析與現代 C++ 改良建議 (智慧指標、註冊表模式)。
| 角色 | 類別 | 職責 |
|---|---|---|
| Product (抽象產品) | Operation | 定義 GetResult() 純虛函數 |
| ConcreteProduct | OperationAdd, OperationSub, OperationMul, OperationDiv | 具體運算實作 |
| Factory | OperationFactory | createOperation(char) 靜態工廠方法 |
#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 自動釋放
}
+----------------+ +---------------------+ | Operation |<------| OperationFactory | |----------------| |---------------------| | +numA: double | | +Create(char): | | +numB: double | | unique_ptr| | +GetResult()=0 | +---------------------+ +-------^--------+ | +-----+-----+-----+-----+ | | | | | Add Sub Mul Div (擴充)
| 優點 | 缺點 |
|---|---|
| 客戶端解耦具體類別,只依賴抽象介面 | 工廠類別集中所有建立邏輯,違反開放封閉原則 (OCP) |
| 單一職責:建立邏輯集中管理 | 新增產品需修改工廠 switch,重新編譯部署 |
| 簡單易懂,適合產品數量固定/較少場景 | 靜態工廠方法難以支援參數化建構 |
unique_ptr 明確所有權,避免記憶體洩漏。map<string, creator_func>,新增產品零修改工廠原始碼。std::any 或 variant 參數包,轉發至建構子。new),無複雜初始化依賴。簡單工廠模式以「集中建立、介面解耦」為核心價值。掌握其結構後,理解為何需進化為「工廠方法」 (去中心化建立) 與「抽象工廠」 (產品族建立),即可建立完整創建型模式知識體系。現代 C++ 實作請善用 unique_ptr、make_unique 與註冊表模式提升擴展性與安全性。