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

C++ 抽象工厂模式详解

       抽象工厂模式是一种创建型设计模式,它提供了一种方式来封装一组具有共同主题的独立工厂,而不需要指定它们的具体类。        

概念解析

        抽象工厂模式的核心思想是:

  1. 提供一个接口用于创建相关或依赖对象的家族,而不需要明确指定具体类

  2. 将对象的创建与使用分离

  3. 支持产品家族的创建,确保创建的产品是兼容的

主要组成部分

         抽象工厂(Abstract Factory):声明创建抽象产品对象的接口

         具体工厂(Concrete Factory):实现创建具体产品对象的操作

         抽象产品(Abstract Product):为一类产品对象声明接口

         具体产品(Concrete Product):定义具体工厂创建的产品对象,实现抽象产品接口

         客户端(Client):仅使用由抽象工厂和抽象产品类声明的接口

代码示例

#include <iostream>
#include <memory>
#include <string>// 抽象产品A:按钮接口
class Button {
public:virtual void render() = 0;virtual void onClick() = 0;virtual ~Button() = default;
};// 抽象产品B:复选框接口
class CheckBox {
public:virtual void render() = 0;virtual void onCheck() = 0;virtual ~CheckBox() = default;
};// 具体产品A1:Windows按钮
class WindowsButton : public Button {
public:void render() override {std::cout << "渲染一个Windows风格的按钮" << std::endl;}void onClick() override {std::cout << "Windows按钮点击事件处理" << std::endl;}
};// 具体产品A2:MacOS按钮
class MacOSButton : public Button {
public:void render() override {std::cout << "渲染一个MacOS风格的按钮" << std::endl;}void onClick() override {std::cout << "MacOS按钮点击事件处理" << std::endl;}
};// 具体产品B1:Windows复选框
class WindowsCheckBox : public CheckBox {
public:void render() override {std::cout << "渲染一个Windows风格的复选框" << std::endl;}void onCheck() override {std::cout << "Windows复选框选中事件处理" << std::endl;}
};// 具体产品B2:MacOS复选框
class MacOSCheckBox : public CheckBox {
public:void render() override {std::cout << "渲染一个MacOS风格的复选框" << std::endl;}void onCheck() override {std::cout << "MacOS复选框选中事件处理" << std::endl;}
};// 抽象工厂接口
class GUIFactory {
public:virtual std::unique_ptr<Button> createButton() = 0;virtual std::unique_ptr<CheckBox> createCheckBox() = 0;virtual ~GUIFactory() = default;
};// 具体工厂1: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>();}
};// 具体工厂2:MacOS工厂
class MacOSFactory : public GUIFactory {
public:std::unique_ptr<Button> createButton() override {return std::make_unique<MacOSButton>();}std::unique_ptr<CheckBox> createCheckBox() override {return std::make_unique<MacOSCheckBox>();}
};// 客户端代码
class Application {
private:std::unique_ptr<GUIFactory> factory_;std::unique_ptr<Button> button_;std::unique_ptr<CheckBox> checkbox_;public:// 构造函数接收一个抽象工厂explicit Application(std::unique_ptr<GUIFactory> factory) : factory_(std::move(factory)) {}// 创建UI组件void createUI() {button_ = factory_->createButton();checkbox_ = factory_->createCheckBox();}// 渲染UIvoid render() {if (button_ && checkbox_) {button_->render();checkbox_->render();}}// 模拟用户交互void simulateUserActions() {if (button_ && checkbox_) {button_->onClick();checkbox_->onCheck();}}
};// 根据配置创建适当的工厂
std::unique_ptr<GUIFactory> createFactory(const std::string& os_type) {if (os_type == "Windows") {return std::make_unique<WindowsFactory>();} else if (os_type == "MacOS") {return std::make_unique<MacOSFactory>();}throw std::runtime_error("未知的操作系统类型");
}int main() {std::cout << "请选择操作系统类型 (Windows/MacOS): ";std::string os_type;std::cin >> os_type;try {// 创建对应操作系统的工厂auto factory = createFactory(os_type);// 创建应用并配置工厂Application app(std::move(factory));// 创建UIapp.createUI();// 渲染UIapp.render();// 模拟用户交互app.simulateUserActions();} catch (const std::exception& e) {std::cerr << "错误: " << e.what() << std::endl;return 1;}return 0;
}

模式优势

  1. 确保产品兼容性:抽象工厂确保创建的产品是兼容的(都是Windows风格或都是MacOS风格)

  2. 解耦客户端代码:客户端代码只与抽象接口交互,不依赖具体实现

  3. 单一职责原则:将产品创建代码集中在一个位置,便于维护

  4. 开闭原则:引入新的产品变体(如Linux风格)时无需修改现有代码

适用场景

  1. 当系统需要独立于其产品的创建、组合和表示时

  2. 当系统需要配置多个产品家族中的一个时

  3. 当需要强调一系列相关产品对象的设计以便联合使用时

  4. 当需要提供一个产品类库,但只想显示它们的接口而非实现时

与其他模式的关系

  1. 与工厂方法模式:抽象工厂通常基于一组工厂方法实现

  2. 与单例模式:具体工厂通常实现为单例

  3. 与原型模式:抽象工厂可以使用原型模式来初始化产品对象

相关文章:

  • NuttX 与 PX4 系统开发全流程详解
  • 多协议 Tracker 系统架构与传感融合实战 第四章 IMU 与 UWB 传感融合框架
  • Qt SQL 核心类说明文档
  • Chromium 134 编译指南 - Android 篇(八):开始编译
  • 【RabbitMQ】 RabbitMQ快速上手
  • java面向对象编程【高级篇】之特殊类
  • 大数据技术:从趋势到变革的全景探索
  • #Paper Reading# DeepSeek Math
  • 摩尔缠论课程合集完整版核心课程前置课程圈子问答星球圈子摩尔缠论三个阶段
  • Mysql的范式都有哪些?
  • C++负载均衡远程调用学习之异步消息任务功能与连接属性
  • AI优化SEO关键词实践路径
  • 扩散模型:了解ai生图的原理
  • (38)VTK C++开发示例 ---纹理裁剪
  • 如何提升个人的理解能力?
  • 【中间件】brpc_基础_execution_queue
  • HuggingFace常用加载模型方法
  • RabbitMQ 中的六大工作模式介绍与使用
  • Spring IoC 注解式开发全解析
  • linux netlink实现用户态和内核态数据交互
  • 巴方称印军发动24起袭击,巴境内6处地点遭袭致8人死亡
  • 上海虹桥高铁站拦门事件反转,谁在带偏网友?
  • 网友建议平顶山请刘昊然任旅游宣传大使,市委:有此设想,正申请经费
  • 中标多家学校采购项目的App查成绩需付费?涉事公司回应
  • 新闻1+1丨多地政府食堂开放“舌尖上的服务”,反映出怎样的理念转变?
  • 胡塞武装称以色列所有机场均为其打击目标