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

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

注意:复现代码时,确保 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)验证不同工厂的行为一致性。

模式结构解析网图备份

在这里插入图片描述

相关文章:

  • MySQL JOIN 与子查询深度对比:原理、性能陷阱与优化策略
  • 【C++学习篇】智能指针
  • 七、Redis 内存管理详解:模型、优化策略(LRU/LFU、对象共享)
  • 从零开始学 Node.js:完整安装与实战指南
  • vulnhub靶场之【digitalworld.local系列】的JOY靶机
  • 深入解析英文单词“Dime”——从硬币到篮球助攻
  • 滑动窗口法——实践中的BA
  • win10 HV主机服务无法启动(wsl安装失败)
  • 缺陷VS质量:为何软件缺陷是质量属性的致命对立面?
  • Python 图像处理之 Pillow 库:玩转图片
  • Graph RAG 迎来记忆革命:“海马体”机制让问答更精准!
  • 【 <一> 炼丹初探:JavaWeb 的起源与基础】之 JSP 基础语法:从脚本片段到 EL 表达式
  • 社会力模型:Social force model for pedestrian dynamics
  • 苹果手机备忘录怎么导入安卓手机?
  • 【C#】Clipboard中SetImage(BitmapSource image)的用法
  • Docker 安装与使用
  • 竞争只属于失败者
  • 探索文件IO奥秘:初识文件
  • Java 第十一章 GUI编程(2)
  • C与C++中inline关键字的深入解析与使用指南
  • 做兼职最靠谱的网站/百度人工客服24小时
  • 做化工外贸需要那些网站/什么是关键词搜索
  • 成都建设监理协会网站/app推广拉新一手渠道
  • 地产设计网站/最新国际新闻
  • 有哪些建设工程类网站/福州seo排名公司
  • 网站建设好销售吗/关键词检测