C++的设计模式:抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式通过将单个的简单工厂模式组合起来实现更复杂的选择逻辑,使得增加新的功能变得更加容易,从而提高了系统的抽象性和灵活性。

意图

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

应用场景

  • 当需要创建的对象是一系列相互关联或相互依赖的产品族时。
  • 当你想提供一个产品类库,而只想显示它们的接口而不是实现时。

实现

假设我们要创建一个跨平台的UI库,它可以生成不同风格(如Light和Dark主题)的UI控件(如按钮和复选框)。这里,我们可以使用抽象工厂模式来实现。

首先,我们定义UI控件的接口和具体实现。

复制代码
#include <iostream>
#include <string>

// Button 接口
class Button {
public:
    virtual void paint() = 0;
    virtual ~Button() {}
};

// 具体产品:LightButton
class LightButton : public Button {
public:
    void paint() override {
        std::cout << "Rendering a button in light style." << std::endl;
    }
};

// 具体产品:DarkButton
class DarkButton : public Button {
public:
    void paint() override {
        std::cout << "Rendering a button in dark style." << std::endl;
    }
};

// CheckBox 接口
class CheckBox {
public:
    virtual void paint() = 0;
    virtual ~CheckBox() {}
};

// 具体产品:LightCheckBox
class LightCheckBox : public CheckBox {
public:
    void paint() override {
        std::cout << "Rendering a checkbox in light style." << std::endl;
    }
};

// 具体产品:DarkCheckBox
class DarkCheckBox : public CheckBox {
public:
    void paint() override {
        std::cout << "Rendering a checkbox in dark style." << std::endl;
    }
};

接着,我们定义抽象工厂接口和具体工厂。

复制代码
// GUIFactory 是抽象工厂的接口
class GUIFactory {
public:
    virtual Button* createButton() = 0;
    virtual CheckBox* createCheckBox() = 0;
    virtual ~GUIFactory() {}
};

// 具体工厂:LightFactory
class LightFactory : public GUIFactory {
public:
    Button* createButton() override {
        return new LightButton();
    }
    CheckBox* createCheckBox() override {
        return new LightCheckBox();
    }
};

// 具体工厂:DarkFactory
class DarkFactory : public GUIFactory {
public:
    Button* createButton() override {
        return new DarkButton();
    }
    CheckBox* createCheckBox() override {
        return new DarkCheckBox();
    }
};

最后,客户端代码可以这样使用:

复制代码
int main() {
    GUIFactory* factory = new LightFactory();
    Button* button = factory->createButton();
    button->paint(); // Render a button in light style.

    CheckBox* checkBox = factory->createCheckBox();
    checkBox->paint(); // Render a checkbox in light style.

    delete factory;
    delete button;
    delete checkBox;

    // 切换到暗黑风格
    factory = new DarkFactory();
    button = factory->createButton();
    button->paint(); // Render a button in dark style.

    checkBox = factory->createCheckBox();
    checkBox->paint(); // Render a checkbox in dark style.

    delete factory;
    delete button;
    delete checkBox;

    return 0;
}

总结

抽象工厂模式通过定义一个负责创建一系列相关或相互依赖对象的接口,使得创建过程被封装在工厂的内部。这样,客户端代码只需要和接口打交道,而不需要关心具体的产品类,从而使得系统更加灵活,更容易应对变化。同时,它也有助于保持产品族的一致性。

相关推荐
hetao173383715 分钟前
2025-12-02~03 hetao1733837的刷题记录
c++·算法
“愿你如星辰如月”20 分钟前
C++11核心特性全解析
开发语言·c++
广都--编程每日问27 分钟前
c++右键菜单统一转化文件为utf8编码
c++·windows·python
点云SLAM27 分钟前
C++包装器之类型擦除(Type Erasure)包装器之小对象优化(SBO, Small Buffer Optimization)示例(5)
c++·内存管理·c++高级应用·c++包装器·类型擦除包装器·内存小对象优化
curry____30336 分钟前
study in PTA(高精度算法与预处理)(2025.12.3)
数据结构·c++·算法·高精度算法
lijiatu100861 小时前
[C++] QTimer与Qt事件循环机制 实验探究
c++·qt
三月微暖寻春笋1 小时前
【和春笋一起学C++】(四十九)C++中string类的简介
c++·cstring·string类·string类的实现·string类方法
Bona Sun1 小时前
单片机手搓掌上游戏机(二十一)—pico运行doom之修改编译
c语言·c++·单片机·游戏机
松涛和鸣2 小时前
23、链式栈(LinkStack)的实现与多场景应用
linux·c语言·c++·嵌入式硬件·ubuntu
CC.GG2 小时前
【C++】面向对象三大特性之一——继承
java·数据库·c++