模式定義
定義一個創建對象的接口,讓子類決定實例化哪個類。工廠方法將實例化推遲到子類。
適用場景
- 類不知道它必須創建的對象的類
- 類希望由子類指定創建的對象
- 將創建職責委託給多個輔助子類之一
角色結構
| 角色 | 職責 |
| Product | 定義工廠方法創建的對象接口 |
| ConcreteProduct | 實現 Product 接口 |
| Creator | 聲明工廠方法,返回 Product;可提供默認實現 |
| ConcreteCreator | 重寫工廠方法返回 ConcreteProduct 實例 |
C++ 代碼實現
// 抽象產品
class Product {
public:
virtual ~Product() = default;
virtual void operate() = 0;
};
// 具體產品
class ConcreteProduct1 : public Product {
public:
void operate() override { /* 產品1邏輯 */ }
};
class ConcreteProduct2 : public Product {
public:
void operate() override { /* 產品2邏輯 */ }
};
// 抽象創建者
class Creator {
public:
virtual ~Creator() = default;
virtual Product* createProduct() = 0; // 工廠方法
// 可選:提供默認創建邏輯
// Product* createProduct() { return new ConcreteProduct1(); }
};
// 具體創建者
class ConcreteCreator1 : public Creator {
public:
Product* createProduct() override { return new ConcreteProduct1(); }
};
class ConcreteCreator2 : public Creator {
public:
Product* createProduct() override { return new ConcreteProduct2(); }
};
// 客戶端使用
int main() {
Creator* c1 = new ConcreteCreator1();
Product* p1 = c1->createProduct();
p1->operate();
delete p1; delete c1;
Creator* c2 = new ConcreteCreator2();
Product* p2 = c2->createProduct();
p2->operate();
delete p2; delete c2;
return 0;
}
擴展性優勢
- 新增產品只需添加
ConcreteProduct3 和 ConcreteCreator3
- 現有代碼無需修改(開閉原則)
- 客戶端針對抽象
Creator/Product 編程
與簡單工廠區別
- 簡單工廠:單一工廠類含 switch/if 創建邏輯,違反開閉原則
- 工廠方法:創建邏輯分散到各具體創建者,符合開閉原則