【C++设计模式】第三篇:抽象工厂模式(Abstract Factory)

ops/2025/3/5 6:24:53/

注意:复现代码时,确保 VS2022 使用 C++17/20 标准以支持现代特性。

构建相关对象族的统一接口,保障产品兼容性


1. 模式定义与用途

核心目标:提供一个接口,用于创建一系列相关或依赖对象,而无需指定它们的具体类。
常见场景

  • 跨平台UI系统(同时创建风格一致的按钮、窗口、滚动条)
  • 数据库访问层(统一生成连接、命令、事务对象,支持多种数据库)
  • 游戏资源加载(为不同画质模式创建匹配的材质、模型、音效)

2. 模式结构解析

在这里插入图片描述

  • AbstractFactory:声明创建产品族的方法(如 createButton(), createWindow()
  • ConcreteFactory:实现具体产品族的创建(如 WindowsFactory, MacOSFactory
  • AbstractProduct:定义产品接口(如 IButton, IWindow
  • ConcreteProduct:实现具体产品(如 WindowsButton,MacOSWindow

3. 现代 C++ 实现示例:跨平台UI组件

3.1 基础实现

#include <iostream>
#include <memory>// 抽象产品:按钮
class IButton {
public:virtual ~IButton() = default;virtual void render() const = 0;
};// 具体产品:Windows 按钮
class WindowsButton : public IButton {
public:void render() const override {std::cout << "[Windows] Flat-style button\n";}
};// 具体产品:MacOS 按钮
class MacOSButton : public IButton {
public:void render() const override {std::cout << "[MacOS] Rounded button\n";}
};// 抽象产品:窗口
class IWindow {
public:virtual ~IWindow() = default;virtual void draw() const = 0;
};// 具体产品:Windows 窗口
class WindowsWindow : public IWindow {
public:void draw() const override {std::cout << "[Windows] Rectangular window with Aero effect\n";}
};// 具体产品:MacOS 窗口
class MacOSWindow : public IWindow {
public:void draw() const override {std::cout << "[MacOS] Rounded corners window with traffic lights\n";}
};// 抽象工厂
class UIFactory {
public:virtual ~UIFactory() = default;virtual std::unique_ptr<IButton> createButton() const = 0;virtual std::unique_ptr<IWindow> createWindow() const = 0;
};// 具体工厂:Windows 风格
class WindowsUIFactory : public UIFactory {
public:std::unique_ptr<IButton> createButton() const override {return std::make_unique<WindowsButton>();}std::unique_ptr<IWindow> createWindow() const override {return std::make_unique<WindowsWindow>();}
};// 具体工厂:MacOS 风格
class MacOSUIFactory : public UIFactory {
public:std::unique_ptr<IButton> createButton() const override {return std::make_unique<MacOSButton>();}std::unique_ptr<IWindow> createWindow() const override {return std::make_unique<MacOSWindow>();}
};// 客户端:构建完整UI界面
void buildUI(const UIFactory& factory) {auto button = factory.createButton();auto window = factory.createWindow();window->draw();button->render();
}int main() {WindowsUIFactory winFactory;buildUI(winFactory);  // 输出Windows风格组件MacOSUIFactory macFactory;buildUI(macFactory);  // 输出MacOS风格组件return 0;
}

代码解析

  • 工厂类(WindowsUIFactory/MacOSUIFactory)确保创建的按钮、窗口风格一致。
  • 新增产品类型(如滚动条)只需扩展抽象工厂接口,无需修改已有客户端代码。

3.2 动态配置的多主题支持

#include <unordered_map>
#include <functional>// 主题类型枚举
enum class ThemeType { Material, Neumorphism, PixelArt };// 抽象工厂注册模板(C++17 特性)
template <typename T>
class ThemeFactoryRegistry {
public:using FactoryCreator = std::function<std::unique_ptr<T>()>;static void registerTheme(ThemeType type, FactoryCreator creator) {getRegistry()[type] = creator;}static std::unique_ptr<T> create(ThemeType type) {auto it = getRegistry().find(type);if (it != getRegistry().end()) {return it->second();}throw std::runtime_error("Unsupported theme type");}private:static std::unordered_map<ThemeType, FactoryCreator>& getRegistry() {static std::unordered_map<ThemeType, FactoryCreator> registry;return registry;}
};// 具体主题注册示例
class MaterialUIFactory : public UIFactory { /*...*/ };
class NeumorphismUIFactory : public UIFactory { /*...*/ };void registerThemes() {ThemeFactoryRegistry<UIFactory>::registerTheme(ThemeType::Material, [] { return std::make_unique<MaterialUIFactory>(); });ThemeFactoryRegistry<UIFactory>::registerTheme(ThemeType::Neumorphism,[] { return std::make_unique<NeumorphismUIFactory>(); });
}// 运行时切换主题
void loadUserPreferredTheme() {auto factory = ThemeFactoryRegistry<UIFactory>::create(ThemeType::Neumorphism);buildUI(*factory);
}

代码解析

  • 利用模板和 std::function 实现主题动态注册,支持热切换。
  • 结合配置文件可实现用户自定义主题的实时加载。

4. 应用场景示例:数据库访问抽象

// 抽象产品:数据库连接
class IDBConnection {
public:virtual void open() = 0;virtual void execute(const std::string& query) = 0;
};// 抽象产品:数据库事务
class IDBTransaction {
public:virtual void begin() = 0;virtual void commit() = 0;
};// 抽象工厂
class DBFactory {
public:virtual std::unique_ptr<IDBConnection> createConnection() = 0;virtual std::unique_ptr<IDBTransaction> createTransaction() = 0;
};// MySQL 具体实现
class MySQLConnection : public IDBConnection { /*...*/ };
class MySQLTransaction : public IDBTransaction { /*...*/ };class MySQLFactory : public DBFactory {
public:std::unique_ptr<IDBConnection> createConnection() override {return std::make_unique<MySQLConnection>();}std::unique_ptr<IDBTransaction> createTransaction() override {return std::make_unique<MySQLTransaction>();}
};// PostgreSQL 具体实现
class PostgreSQLConnection : public IDBConnection { /*...*/ };
class PostgreSQLTransaction : public IDBTransaction { /*...*/ };// 客户端代码保持与具体数据库解耦
void runDatabaseOperations(DBFactory& factory) {auto conn = factory.createConnection();auto txn = factory.createTransaction();conn->open();txn->begin();// ... 执行操作txn->commit();
}

5. 优缺点分析

优点缺点
严格保证产品族的兼容性新增产品类型需修改所有工厂
隐藏具体类实现细节代码复杂度随产品数量指数增长
易于切换整个产品系列需要预先设计完善的产品层次

6. 调试与优化策略

  • 类型安全检查:使用 typeiddynamic_cast 验证多态对象的实际类型。
  • 性能监控:对高频创建的对象族,采用原型模式(Prototype)缓存实例。
  • 跨平台测试:结合条件编译(#ifdef)验证不同工厂的行为一致性。

模式结构解析网图备份

在这里插入图片描述


http://www.ppmy.cn/ops/163234.html

相关文章

快速高效使用——阿里通义万相2.1的文生图、文生视频功能

前言&#xff1a;你仅需提供简单的几个提示词&#xff0c;即可快速高效帮你生成更为丰富的提示词并生成满意的图片或者视频。无论是为了创作艺术作品、设计商业宣传素材&#xff0c;还是满足个人兴趣爱好等&#xff0c;都能快速将脑海中的想法转化为逼真的图片或生动的视频。 目…

【Linux操作系统】VM17虚拟机安装Ubuntu22.04,图文详细记录

1.双击桌面的 VMware Workstation17 Player&#xff0c;点击“创建新虚拟机”&#xff0c;如下图所示。 2.选择“稍后安装操作系统”&#xff0c;点击“下一步”。如下图所示。 3.客户机操作系统选择“Linux”&#xff0c;版本选择“ Ubuntu 64位”&#xff0c;然后点击“下一…

104.二叉树的最大深度

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;ro…

数据高质量与合规,守护AI模型的真实未来

在人工智能&#xff08;AI&#xff09;技术迅猛发展的今天&#xff0c;高质量的数据已成为推动AI模型进步的核心要素。然而&#xff0c;随着合成数据&#xff08;Synthetic Data&#xff09;的广泛应用&#xff0c;数据质量和伦理问题日益凸显。欧盟《人工智能法案》&#xff0…

虚拟机ip配置

VMware 虚拟机中 Linux 系统 IP 配置 1. 确认网络连接模式 VMware 提供了三种常用的网络连接模式&#xff1a;桥接模式、NAT 模式和仅主机模式。不同模式下 IP 配置方法有所差异。 桥接模式&#xff1a;虚拟机直接连接到物理网络&#xff0c;相当于网络中的一台独立设备&#…

【计算机视觉】手势识别

手势识别是计算机视觉领域中的重要方向&#xff0c;通过对摄像机采集的手部相关的图像序列进行分析处理&#xff0c;进而识别其中的手势&#xff0c;手势被识别后用户就可以通过手势来控制设备或者与设备交互。完整的手势识别一般有手的检测和姿态估计、手部跟踪和手势识别等。…

e2studio开发RA4M2(15)----配置RTC时钟及显示时间

e2studio开发RA4M2.15--配置RTC时钟及显示时间 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置SWD调试口设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user…

黄色调旅拍视频颜色分级调色lut预设素材 FCPX Full Access – Yellow Tint LUT – Single LUT

黄色调旅拍视频颜色分级调色lut预设素材 FCPX Full Access – Yellow Tint LUT – Single LUT “Yellow Tint” 是一个强大的实用 LUT&#xff0c;用于在场景中创建压倒性的黄色调&#xff0c;将所有颜色值推向黄色光谱。 包括 LUT 配置文件 ✅ .cube .3dl 格式 ✅ 安装说…