当前位置: 首页 > news >正文

C++ 设计模式-抽象工厂

C++中的抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个接口,用来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。通过抽象工厂模式,客户端可以通过工厂接口获取一系列产品的实例,而不需要知道它们的具体类。

抽象工厂模式的结构

  1. AbstractFactory(抽象工厂):声明了创建抽象产品的方法。
  2. ConcreteFactory(具体工厂):实现了创建具体产品的方法。
  3. AbstractProduct(抽象产品):为每种产品声明一个接口。
  4. ConcreteProduct(具体产品):实现了抽象产品接口的具体产品。
  5. Client(客户端):只依赖于抽象工厂和抽象产品,而无需了解具体类。

示例代码

假设我们在设计一个UI框架,要支持不同操作系统(Windows和Mac)的UI元素。

1. 定义抽象产品
// 抽象按钮类
class Button {
public:
    virtual void render() = 0;
    virtual ~Button() = default;
};

// 抽象复选框类
class Checkbox {
public:
    virtual void render() = 0;
    virtual ~Checkbox() = default;
};
2. 定义具体产品
// 具体Windows按钮类
class WindowsButton : public Button {
public:
    void render() override {
        std::cout << "Rendering Windows Button" << std::endl;
    }
};

// 具体Windows复选框类
class WindowsCheckbox : public Checkbox {
public:
    void render() override {
        std::cout << "Rendering Windows Checkbox" << std::endl;
    }
};

// 具体Mac按钮类
class MacButton : public Button {
public:
    void render() override {
        std::cout << "Rendering Mac Button" << std::endl;
    }
};

// 具体Mac复选框类
class MacCheckbox : public Checkbox {
public:
    void render() override {
        std::cout << "Rendering Mac Checkbox" << std::endl;
    }
};
3. 定义抽象工厂
class GUIFactory {
public:
    virtual Button* createButton() = 0;
    virtual Checkbox* createCheckbox() = 0;
    virtual ~GUIFactory() = default;
};
4. 定义具体工厂
// Windows工厂
class WindowsFactory : public GUIFactory {
public:
    Button* createButton() override {
        return new WindowsButton();
    }

    Checkbox* createCheckbox() override {
        return new WindowsCheckbox();
    }
};

// Mac工厂
class MacFactory : public GUIFactory {
public:
    Button* createButton() override {
        return new MacButton();
    }

    Checkbox* createCheckbox() override {
        return new MacCheckbox();
    }
};
5. 客户端代码
void renderUI(GUIFactory* factory) {
    Button* button = factory->createButton();
    Checkbox* checkbox = factory->createCheckbox();
    
    button->render();
    checkbox->render();
    
    delete button;
    delete checkbox;
}

int main() {
    GUIFactory* factory;
    
    // 创建Windows的UI元素
    factory = new WindowsFactory();
    renderUI(factory);
    delete factory;

    // 创建Mac的UI元素
    factory = new MacFactory();
    renderUI(factory);
    delete factory;

    return 0;
}

输出

Rendering Windows Button
Rendering Windows Checkbox
Rendering Mac Button
Rendering Mac Checkbox

总结

  • 抽象工厂模式通过创建一个工厂接口来生成相关的产品族(如UI元素),每个具体工厂根据操作系统(Windows、Mac等)来创建适当的产品对象。
  • 客户端不直接依赖具体产品类,而是通过工厂接口获取需要的产品实例,这样可以保持产品的独立性和扩展性。

相关文章:

  • Vision Transformer:打破CNN垄断,全局注意力机制重塑计算机视觉范式
  • 网络安全防范课后参考答案
  • Python爬虫实战:股票分时数据抓取与存储 (1)
  • 设计模式-模版方法
  • 【stm32f407hal库】定时器定时功能
  • web自动化-浏览器驱动下载
  • Linux Mem -- Where the mte store and check in the real hardware platform
  • html css js网页制作成品——HTML+CSS+js茉酸奶的茶网页设计(5页)附源码
  • C++基础知识(三)之结构体、共同体、枚举、引用、函数重载
  • MS08067练武场--WP
  • GBD研究——美国州级地图(附资源)
  • TDengine 客户端连接工具 taos-Cli
  • 盛铂科技 SMF106 低相位噪声贴片式频率综合器模块
  • xfeat paper笔记
  • 国自然专项项目申请:AI赋能的急性心肌梗死预警研究|基金申请·25-02-14
  • 第J2周:ResNet50V2算法实战与解析
  • 二叉树详解
  • Springboot整合ES
  • 【NLP251】命名实体识别常用模块(基于Transformer分类)
  • PyTorch 混合精度训练中的警告处理与代码适配指南
  • 严打金融黑灰产,今年来上海警方破获各类经济犯罪案件690余起
  • 制造四十余年血腥冲突后,库尔德工人党为何自行解散?
  • 汕头违建豪宅“英之园”将强拆,当地:将根据公告期内具体情况采取下一步措施
  • 上海市重大工程一季度开局良好,崇明线等按既定计划加快建设
  • 中巴续签双边本币互换协议,进一步深化金融战略合作
  • 今天北京白天气温超30℃,晚间为何下冰雹?