核心思想:一個工廠類根據參數決定創建哪種產品對象,將對象創建邏輯封裝,客戶端無需知道具體類名。
class AnimalFactory {
public:
static Animal* createAnimal(string type) {
if (type == "Human") return new Human();
if (type == "Bird") return new Bird();
return nullptr;
}
};
優點:客戶端解耦具體類,創建邏輯集中管理。
缺點:違反開閉原則——新增產品需修改工廠類源碼(增加 if/else 分支),不利於擴展。
定義:定義一個創建對象的接口,由子類決定實例化哪個類。將創建責任下放到子類,實現「開閉原則」。
Animal,聲明公共接口。Human, Bird。create()。HumanFactory, BirdFactory,實現 create() 返回對應產品。// 抽象產品
class Animal { public: virtual void func() = 0; };
// 具體產品
class Human : public Animal { void func() override { cout << "I am a human. I can walk!"; } };
class Bird : public Animal { void func() override { cout << "I am a bird. I can fly!"; } };
// 抽象工廠
class AnimalFactory { public: virtual Animal* create() = 0; };
// 具體工廠
class HumanFactory : public AnimalFactory { Animal* create() override { return new Human(); } };
class BirdFactory : public AnimalFactory { Animal* create() override { return new Bird(); } };
// 客戶端
int main() {
AnimalFactory* factory = new HumanFactory();
Animal* a = factory->create(); a->func(); // I am a human...
factory = new BirdFactory();
a = factory->create(); a->func(); // I am a bird...
}
| 維度 | 簡單工廠 | 工廠方法 |
|---|---|---|
| 擴展新產品 | 修改工廠類源碼(違反開閉) | 新增具體工廠類(符合開閉) |
| 客戶端依賴 | 依賴具體工廠類 | 依賴抽象工廠接口 |
| 適用場景 | 產品種類固定、較少 | 產品族擴展頻繁、需高度解耦 |
若需創建相關/依賴的產品族(如不同風格的 UI 組件:WinButton/WinMenu, MacButton/MacMenu),則需抽象工廠模式:一個工廠接口包含多個創建方法(createButton(), createMenu()),每個具體工廠生產一整族產品。