首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

設計模式筆記:從簡單工廠到工廠方法模式的演進

     編輯:關於C++

簡單工廠模式:起步與局限

核心思想:一個工廠類根據參數決定創建哪種產品對象,將對象創建邏輯封裝,客戶端無需知道具體類名。

class AnimalFactory {
public:
    static Animal* createAnimal(string type) {
        if (type == "Human") return new Human();
        if (type == "Bird") return new Bird();
        return nullptr;
    }
};

優點:客戶端解耦具體類,創建邏輯集中管理。
缺點:違反開閉原則——新增產品需修改工廠類源碼(增加 if/else 分支),不利於擴展。

工廠方法模式:解決擴展性問題

定義:定義一個創建對象的接口,由子類決定實例化哪個類。將創建責任下放到子類,實現「開閉原則」。

結構

  • Product(抽象產品):如 Animal,聲明公共接口。
  • ConcreteProduct(具體產品):如 Human, Bird。
  • Factory(抽象工廠):聲明工廠方法 create()。
  • ConcreteFactory(具體工廠):如 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()),每個具體工廠生產一整族產品。

核心原則

  • 依賴倒置:高層模塊(客戶端)不依賴低層模塊(具體產品/工廠),雙方依賴抽象。
  • 單一職責:每個具體工廠只負責一種產品的創建。
  • 開閉原則:對擴展開放(新增工廠/產品),對修改關閉(不動核心代碼)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved