定義一個用於創建物件的介面,讓子類別決定實例化哪一個類別。Factory Method 使一個類別的實例化延遲到其子類別。

FactoryMethod(),並提供 AnOperation() 使用產品。FactoryMethod() 回傳具體產品。#ifndef FACTORY_H
#define FACTORY_H
class Product {
public:
Product() {}
virtual ~Product() {}
};
class ConcreteProduct : public Product {
public:
ConcreteProduct();
virtual ~ConcreteProduct();
};
class Creator {
public:
Creator() {}
virtual ~Creator() {}
void AnOperation();
protected:
virtual Product* FactoryMethod() = 0;
};
class ConcreteCreator : public Creator {
public:
ConcreteCreator();
virtual ~ConcreteCreator();
protected:
virtual Product* FactoryMethod();
};
#endif
#include "Factory.h"
#include <iostream>
using namespace std;
ConcreteProduct::ConcreteProduct() { cout << "construction of ConcreteProduct\n"; }
ConcreteProduct::~ConcreteProduct() { cout << "destruction of ConcreteProduct\n"; }
void Creator::AnOperation() {
Product* p = FactoryMethod();
cout << "an operation of product\n";
}
ConcreteCreator::ConcreteCreator() { cout << "construction of ConcreteCreator\n"; }
ConcreteCreator::~ConcreteCreator() { cout << "destruction of ConcreteCreator\n"; }
Product* ConcreteCreator::FactoryMethod() { return new ConcreteProduct(); }
#include "Factory.h"
#include <cstdlib>
int main(int argc, char* argv[]) {
Creator* p = new ConcreteCreator();
p->AnOperation();
delete p;
return 0;
}
| 模式 | 結構 | 適用場景 | 擴充性 |
|---|---|---|---|
| 簡單工廠 | 單一類別含 switch-case 創建 | 產品固定、較少變化 | 違反 OCP,新增產品需修改工廠 |
| 工廠方法 | Creator 衍生體系,每類產品一工廠 | 單一產品等級、需延遲實例化 | 符合 OCP,新增產品只需新增 Creator 子類 |
| 抽象工廠 | 多工廠方法創建相關產品族 | 多產品等級構成家族、需整套切換 | 新增家族易、新增等級難 |
std::unique_ptr<Product> CreateProduct(ProductType type) {
switch (type) {
case ProductType::A: return std::make_unique<ConcreteProductA>();
case ProductType::B: return std::make_unique<ConcreteProductB>();
}
return nullptr;
}
簡單場景下,參數化工廠函數比完整類別體系更輕量。
CreateView()、編譯器 CreateParser()。TestCreator 回傳 Mock 產品。