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

CreateProduct()關鍵在於:核心工廠類不再負責具體產品創建,僅定義介面;具體創建工作延遲到子類執行。新增產品時,只需新增對應的具體工廠與產品類,完全不動原有代碼。
/* 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;
}
| 維度 | 簡單工廠 | 工廠方法 |
|---|---|---|
| 擴展新產品 | 修改工廠類源碼 | 新增具體工廠類 |
| 測試影響範圍 | 全量回歸測試 | 僅測試新增工廠與產品 |
| 符合開閉原則 | 否 | 是 |
| 適用產品數量 | 少、固定 | 多、可擴展 |