设计模式 Day 3:抽象工厂模式(Abstract Factory Pattern)详解

经过前两天的学习,我们已经掌握了单例模式与工厂方法模式,理解了如何控制实例个数与如何通过子类封装对象的创建逻辑。

今天,我们将进一步深入"工厂"体系,学习抽象工厂模式(Abstract Factory Pattern),这是在实际项目中**用于创建"产品族"**的关键设计模式。


一、Day 1~2 回顾

✅ Day 1:单例模式

  • 保证一个类只有一个实例。
  • 适合日志系统、配置加载器、数据库连接池等场景。
  • 推荐使用 C++11 局部静态变量实现线程安全。

✅ Day 2:工厂方法模式

  • 将创建产品的职责下放给子类工厂。
  • 满足开闭原则:添加新产品时只需新增具体工厂和产品类。
  • 适用于"产品种类多变"的系统结构。

二、抽象工厂模式简介

📌 定义:

抽象工厂模式提供一个接口 ,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。

关键词:"一系列相关对象" → 产品族

✅ 场景关键词:

  • 多个产品类型(如按钮、窗口)
  • 同一系列产品(如 Windows 风格、Mac 风格)
  • 产品之间存在匹配关系

三、类图结构

复制代码
             +------------------------+
             |   AbstractFactory      |
             |------------------------|
             | +createButton()        |
             | +createCheckbox()      |
             +-----------+------------+
                         |
       +-----------------+-----------------+
       |                                   |
+-------------+                   +----------------+
| WinFactory  |                   | MacFactory     |
+-------------+                   +----------------+
| +createButton() |              | +createButton() |
| +createCheckbox() |           | +createCheckbox()|

     产品结构(同理)
+-----------------+       +------------------+
| AbstractButton  |<------| WinButton        |
|                 |       | MacButton        |
+-----------------+       +------------------+

四、C++ 实现:跨平台 UI 工厂

我们来设计一个跨平台 GUI 库,可以根据平台生成不同风格的按钮和复选框。

1. 抽象产品类

cpp 复制代码
class Button {
public:
    virtual void paint() = 0;
    virtual ~Button() {}
};

class Checkbox {
public:
    virtual void paint() = 0;
    virtual ~Checkbox() {}
};

2. 具体产品类

cpp 复制代码
class WinButton : public Button {
public:
    void paint() override {
        std::cout << "绘制 Windows 风格按钮" << std::endl;
    }
};

class MacButton : public Button {
public:
    void paint() override {
        std::cout << "绘制 Mac 风格按钮" << std::endl;
    }
};

class WinCheckbox : public Checkbox {
public:
    void paint() override {
        std::cout << "绘制 Windows 风格复选框" << std::endl;
    }
};

class MacCheckbox : public Checkbox {
public:
    void paint() override {
        std::cout << "绘制 Mac 风格复选框" << std::endl;
    }
};

3. 抽象工厂类

cpp 复制代码
class GUIFactory {
public:
    virtual Button* createButton() = 0;
    virtual Checkbox* createCheckbox() = 0;
    virtual ~GUIFactory() {}
};

4. 具体工厂类

cpp 复制代码
class WinFactory : public GUIFactory {
public:
    Button* createButton() override {
        return new WinButton();
    }
    Checkbox* createCheckbox() override {
        return new WinCheckbox();
    }
};

class MacFactory : public GUIFactory {
public:
    Button* createButton() override {
        return new MacButton();
    }
    Checkbox* createCheckbox() override {
        return new MacCheckbox();
    }
};

5. 客户端代码

cpp 复制代码
void render(GUIFactory* factory) {
    Button* btn = factory->createButton();
    Checkbox* chk = factory->createCheckbox();

    btn->paint();
    chk->paint();

    delete btn;
    delete chk;
}

int main() {
    WinFactory win;
    MacFactory mac;

    render(&win);
    render(&mac);
    return 0;
}

五、优缺点分析

✅ 优点:

  • 保证产品族之间的一致性(按钮和复选框风格统一)
  • 满足开闭原则,支持新增平台或产品族
  • 客户端代码不依赖具体产品类,低耦合

❌ 缺点:

  • 类数量增多,结构复杂
  • 不方便支持新增"产品种类"(比如再加个菜单类)

六、今日练习题

✍️ 题目一:

设计一个跨平台图标与窗口组件的 UI 系统,要求使用抽象工厂模式构造 Icon 与 Window 两类产品族,支持 Windows 与 Linux 两个平台。

✍️ 题目二:

抽象工厂模式和工厂方法模式的最大区别是什么?请简洁说明并举例。


七、小结与展望

抽象工厂模式适合管理"产品族",比工厂方法更进一步封装了对象创建的整体体系。掌握它有助于构建可扩展、可复用、风格一致的大型软件系统。

明日预告:建造者模式(Builder Pattern) ------ 用来构建"结构复杂对象"的强大模式,适合生成器、配置器类场景。

相关推荐
博风2 小时前
19、设计模式应用举例:桥接模式:制作电视节目
设计模式·桥接模式
知守观2 小时前
从 4 套 PDF 库的混战,聊聊老项目的依赖管理与“静默失败”
java·后端·设计模式
geovindu1 天前
rust: Mediator Pattern
开发语言·后端·设计模式·rust·中介者模式·行为模式
SENKS_DIGITAL1 天前
金属加工遇上数字化:通快展厅里的工业蜕变-森克思科技
科技·设计模式·展厅设计·展馆设计·科技展厅设计·展览设计·企业展厅设计
flower9803231 天前
C++消息总线软件开发框架AI重构版
c++·设计模式·架构
zzu123zsw2 天前
业务拆分后的治理深水区:解构企业级微服务六大核心设计模式与高可用落真实践
微服务·设计模式·架构·高可用·微服务架构设计
牧瀬クリスだ2 天前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式
拆房老料2 天前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
MobotStone3 天前
AI 写代码越来越爽,但程序员可能越来越废了
人工智能·设计模式
墨子夕3 天前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(前言篇)
java·开发语言·设计模式