文章目錄
- 設計模式之工廠模式:從簡單到抽象的演進
- 1 “工廠”模式分類
- 1.1 簡單工廠(Simple Factory)
- 1.2 工廠方法(Factory Method)
- 1.3 抽象工廠(Abstract Factory)
- 2 分析
- 3 總結對比
設計模式之工廠模式:從簡單到抽象的演進
1 “工廠”模式分類
“工廠”模式在設計模式中是一個重要的創建型模式,它可以分為以下幾類:
1.1 簡單工廠(Simple Factory)
【不是 GOF 23 種經典設計模式之一】
- 特點:由一個工廠類根據傳入參數決定創建哪種產品類。
- 缺點:違反開閉原則,每新增一個產品就要修改工廠邏輯。
- 適用場景:產品種類不多,變化不頻繁。
#include <iostream>
#include <memory>
#include <string>class Shape {
public:virtual void draw() = 0;virtual ~Shape() = default;
};class Circle : public Shape {
public:void draw() override {std::cout << "Drawing Circle\n";}
};class Rectangle : public Shape {
public:void draw() override {std::cout << "Drawing Rectangle\n";}
};class ShapeFactory {
public:static std::unique_ptr<Shape> createShape(const std::string& type) {if (type == "circle") return std::make_unique<Circle>();if (type == "rectangle") return std::make_unique<Rectangle>();return nullptr;}
};// 使用
int main() {auto shape = ShapeFactory::createShape("circle");if (shape) shape->draw();return 0;
}
1.2 工廠方法(Factory Method)
【GOF 經典設計模式之一】
-
特點:定義一個用于創建對象的接口,讓子類決定實例化哪一個類。
-
優點:符合開閉原則。
-
適用場景:產品種類較多,或需要定制化創建流程。
-
與簡單工廠區別:每個產品對應一個具體工廠類;新增產品只需新增一個工廠類,符合開閉原則。
#include <iostream>
#include <memory>class Shape {
public:virtual void draw() = 0;virtual ~Shape() = default;
};class Circle : public Shape {
public:void draw() override {std::cout << "Drawing Circle\n";}
};// 工廠基類
class ShapeFactory {
public:virtual std::unique_ptr<Shape> createShape() = 0;virtual ~ShapeFactory() = default;
};// 工廠子類
class CircleFactory : public ShapeFactory {
public:std::unique_ptr<Shape> createShape() override {return std::make_unique<Circle>();}
};// 使用
int main() {std::unique_ptr<ShapeFactory> factory = std::make_unique<CircleFactory>();auto shape = factory->createShape();shape->draw();return 0;
}
1.3 抽象工廠(Abstract Factory)
【GOF 經典設計模式之一】
-
特點:提供一個接口,用于創建多個相關或依賴的對象族。
-
優點:適合產品之間存在關系(如 UI 控件風格:Windows vs Mac)。
-
適用場景:需要創建多個相互關聯的產品族,而不需要指定具體類。
-
與前面工廠模式的區別:創建一組相關產品(產品族);適用于系統需要生產多個產品系列(如不同平臺的 UI)。
#include <iostream>
#include <memory>// 抽象產品
class Button {
public:virtual void paint() = 0;virtual ~Button() = default;
};class Checkbox {
public:virtual void toggle() = 0;virtual ~Checkbox() = default;
};// Windows 產品
class WindowsButton : public Button {
public:void paint() override {std::cout << "Windows Button\n";}
};class WindowsCheckbox : public Checkbox {
public:void toggle() override {std::cout << "Windows Checkbox toggled\n";}
};// Mac 產品
class MacButton : public Button {
public:void paint() override {std::cout << "Mac Button\n";}
};class MacCheckbox : public Checkbox {
public:void toggle() override {std::cout << "Mac Checkbox toggled\n";}
};// 抽象工廠
class GUIFactory {
public:virtual std::unique_ptr<Button> createButton() = 0;virtual std::unique_ptr<Checkbox> createCheckbox() = 0;virtual ~GUIFactory() = default;
};// Windows 工廠
class WindowsFactory : public GUIFactory {
public:std::unique_ptr<Button> createButton() override {return std::make_unique<WindowsButton>();}std::unique_ptr<Checkbox> createCheckbox() override {return std::make_unique<WindowsCheckbox>();}
};// Mac 工廠
class MacFactory : public GUIFactory {
public:std::unique_ptr<Button> createButton() override {return std::make_unique<MacButton>();}std::unique_ptr<Checkbox> createCheckbox() override {return std::make_unique<MacCheckbox>();}
};// 使用
int main() {std::unique_ptr<GUIFactory> factory = std::make_unique<WindowsFactory>();auto button = factory->createButton();auto checkbox = factory->createCheckbox();button->paint();checkbox->toggle();return 0;
}
2 分析
簡單工廠模式通過一個固定工廠類根據參數決定創建哪個單一產品對象,它是一種集中式、非繼承的設計;
工廠方法模式將創建邏輯交由各自的工廠子類實現,滿足開閉原則,適用于單一產品類的靈活擴展;
抽象工廠模式在工廠方法的基礎上增加了“產品族(多個相關產品)”的抽象接口,統一生產一組彼此關聯的產品,實現更高級別的解耦和擴展。
設計模式 | 核心思想 | 是否使用繼承 |
---|---|---|
簡單工廠 | 使用一個類集中管理對象創建(if-else ) | 否 |
工廠方法 | 為每個產品定義一個創建類(工廠子類) | 是 |
抽象工廠 | 為一組產品族提供統一創建接口 | 是 |
輔助記憶方法:
簡單工廠 = 統一超市收銀臺:你買啥,告訴我商品代碼,我幫你找。
工廠方法 = 各品牌有獨立專賣店:你要耐克去耐克店,要阿迪去阿迪店。
抽象工廠 = 同一品牌店提供一整套商品組合(鞋、衣服、帽子):Nike-全套,Adidas-全套。
3 總結對比
模式 | 是否符合開閉原則 | 是否屬于 GOF 設計模式 | 創建方式 | 應用場景 |
---|---|---|---|---|
簡單工廠 | 不符合 | 否 | 一個工廠方法創建所有產品 | 產品種類較少,創建邏輯簡單,變化不頻繁 |
工廠方法 | 符合 | 是 | 一個產品一個工廠 | 產品種類較多,需擴展性 |
抽象工廠 | 符合 | 是 | 一組產品族使用一個工廠接口 | 不同平臺或風格的產品成組創建,創建“產品族”,產品之間有關聯性 |