工廠方法模式屬於創建型模式,其核心意圖是定義一個創建對象的接口,讓子類決定實例化哪個具體類,從而將對象創建的具體邏輯延遲到子類,實現「開閉原則」——對擴展開放,對修改關閉。

CreateProduct(),可提供默認實現;另含 GetProduct() 等業務方法調用工廠方法。CreateProduct() 返回特定 ConcreteProduct 實例。純虛函數方案要求每個新產品都編寫一個新的 ConcreteCreator 子類,導致類爆炸。C++ 可利用模板技術消除樣板代碼:
class Creator {
public:
virtual Product* CreateProduct() = 0;
Product* GetProduct() {
if (!m_product) m_product = CreateProduct();
return m_product;
}
private:
Product* m_product = nullptr;
};
template <typename TheProduct>
class StandardCreator : public Creator {
public:
Product* CreateProduct() override { return new TheProduct(); }
};
客戶代碼極其簡潔:
StandardCreator<OurProduct> creator;
Product* p = creator.GetProduct(); // 自動創建 OurProduct 實例
#ifndef FACTORY_H
#define FACTORY_H
class Product { };
class Creator {
public:
Creator() : m_pProduct(nullptr) {}
Product* GetProduct();
virtual Product* CreateProduct() = 0;
private:
Product* m_pProduct;
};
template <class TheProduct>
class StandardCreator : public Creator {
public:
virtual Product* CreateProduct();
};
template <typename TheProduct>
Product* StandardCreator<TheProduct>::CreateProduct() {
return new TheProduct();
}
#endif
#include "factory.h"
#include <iostream>
Product* Creator::GetProduct() {
if (nullptr == m_pProduct) {
m_pProduct = CreateProduct();
}
return m_pProduct;
}
#include "factory.h"
#include <iostream>
class MyProduct : public Product {
public:
MyProduct() { std::cout << "MyProduct constructed!\n"; }
};
class YourProduct : public Product {
public:
YourProduct() { std::cout << "YourProduct constructed!\n"; }
};
class OurProduct : public Product {
public:
OurProduct() { std::cout << "OurProduct constructed!\n"; }
};
int main() {
StandardCreator<OurProduct> ourCreator;
Product* p = ourCreator.GetProduct();
StandardCreator<MyProduct> myCreator;
p = myCreator.GetProduct();
StandardCreator<YourProduct> yourCreator;
p = yourCreator.GetProduct();
std::cin.get();
return 0;
}

輸出依次顯示三種產品的構造信息,驗證了模板工廠正確實例化了不同具體產品。
工廠方法模式通過多態性實現創建邏輯的解耦;模板版 StandardCreator 進一步消除了為每個產品編寫具體工廠類的樣板代碼,是 C++ 中實現該模式的優雅慣用法。實際項目中常結合智能指針(std::unique_ptr)管理產品生命周期,避免內存洩漏。