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

C++结构型设计模式之使用抽象工厂来创建和配置桥接模式的例子

下面是一个使用抽象工厂模式来创建和配置桥接模式的示例,场景是创建不同操作系统的窗口(Window)及其对应的实现(WindowImpl)。我们将通过抽象工厂来创建不同操作系统下的窗口和实现。

代码示例

#include <iostream>

// 抽象产品:窗口接口
class Window {
public:
    virtual void draw() = 0;
    virtual void resize() = 0;
};

// 抽象产品:窗口实现接口
class WindowImpl {
public:
    virtual void drawImpl() = 0;
    virtual void resizeImpl() = 0;
};

// 具体产品:Windows窗口
class WindowsWindow : public Window {
private:
    WindowImpl* impl;

public:
    WindowsWindow(WindowImpl* impl) : impl(impl) {}

    void draw() override {
        std::cout << "Drawing Windows Window" << std::endl;
        impl->drawImpl();
    }

    void resize() override {
        std::cout << "Resizing Windows Window" << std::endl;
        impl->resizeImpl();
    }
};

// 具体产品:Linux窗口
class LinuxWindow : public Window {
private:
    WindowImpl* impl;

public:
    LinuxWindow(WindowImpl* impl) : impl(impl) {}

    void draw() override {
        std::cout << "Drawing Linux Window" << std::endl;
        impl->drawImpl();
    }

    void resize() override {
        std::cout << "Resizing Linux Window" << std::endl;
        impl->resizeImpl();
    }
};

// 具体产品:Windows窗口实现
class WindowsWindowImpl : public WindowImpl {
public:
    void drawImpl() override {
        std::cout << "Drawing Windows Impl" << std::endl;
    }

    void resizeImpl() override {
        std::cout << "Resizing Windows Impl" << std::endl;
    }
};

// 具体产品:Linux窗口实现
class LinuxWindowImpl : public WindowImpl {
public:
    void drawImpl() override {
        std::cout << "Drawing Linux Impl" << std::endl;
    }

    void resizeImpl() override {
        std::cout << "Resizing Linux Impl" << std::endl;
    }
};

// 抽象工厂:窗口工厂接口
class WindowFactory {
public:
    virtual Window* createWindow() = 0;
    virtual WindowImpl* createWindowImpl() = 0;
};

// 具体工厂:Windows窗口工厂
class WindowsWindowFactory : public WindowFactory {
public:
    Window* createWindow() override {
        return new WindowsWindow(createWindowImpl());
    }

    WindowImpl* createWindowImpl() override {
        return new WindowsWindowImpl();
    }
};

// 具体工厂:Linux窗口工厂
class LinuxWindowFactory : public WindowFactory {
public:
    Window* createWindow() override {
        return new LinuxWindow(createWindowImpl());
    }

    WindowImpl* createWindowImpl() override {
        return new LinuxWindowImpl();
    }
};

int main() {
    // 创建Windows窗口工厂
    WindowFactory* windowsFactory = new WindowsWindowFactory();
    // 使用Windows工厂创建窗口
    Window* windowsWindow = windowsFactory->createWindow();
    windowsWindow->draw();
    windowsWindow->resize();

    // 创建Linux窗口工厂
    WindowFactory* linuxFactory = new LinuxWindowFactory();
    // 使用Linux工厂创建窗口
    Window* linuxWindow = linuxFactory->createWindow();
    linuxWindow->draw();
    linuxWindow->resize();

    // 清理资源
    delete windowsFactory;
    delete windowsWindow;
    delete linuxFactory;
    delete linuxWindow;

    return 0;
}

代码说明

  1. Window:窗口接口,定义了 draw 和 resize 方法。
  2. WindowImpl:窗口实现接口,定义了 drawImpl 和 resizeImpl 方法。
  3. WindowsWindow 和 LinuxWindow:具体的窗口类,分别实现Windows和Linux系统的窗口。
  4. WindowsWindowImpl 和 LinuxWindowImpl:具体的窗口实现类,分别实现Windows和Linux系统的窗口实现。
  5. WindowFactory:抽象工厂接口,定义了 createWindow 和 createWindowImpl 方法。
  6. WindowsWindowFactory 和 LinuxWindowFactory:具体的工厂类,分别创建Windows和Linux系统的窗口及其对应的实现。
  7. main 函数:演示如何使用抽象工厂来创建和配置不同操作系统下的窗口。

通过这种方式,我们可以在不同的操作系统下创建和配置相应的窗口和实现,而不需要为每种操作系统创建大量的子类。


http://www.kler.cn/a/408958.html

相关文章:

  • SATA接口不通分析案例分享
  • MariaDB面试题及参考答案
  • AIGC学习笔记(6)——AI大模型开发工程师
  • 从零开始-VitePress 构建个人博客上传GitHub自动构建访问
  • archlinux安装waydroid
  • 网络爬虫——常见问题与调试技巧
  • XviD4PSP视频无损转换器
  • oracle的静态注册和动态注册
  • 数据可视化复习2-绘制折线图+条形图(叠加条形图,并列条形图,水平条形图)+ 饼状图 + 直方图
  • 【技术支持】vscode不使用插件,两种方式重命名html标签对
  • 基于物联网设计的人工淡水湖养殖系统(华为云IOT)_253
  • 关于mqtt协议与qt联合开发的实现记录
  • 用Tauri框架构建跨平台桌面应用:1、Tauri快速开始
  • 【桂林理工大学主办 | 往届均已EI检索】第五届能源工程、新能源材料与器件国际学术会议(NEMD 2025)
  • ctfshow -web 89-115-wp
  • 数据结构之二:表
  • RoPE——Transformer 的旋转位置编码
  • Centos使用docker搭建Graylog日志平台
  • python中的base64使用小笑话
  • vue从入门到精通(七):事件处理
  • 全新三网话费余额查询API系统源码 Thinkphp全开源 附教程
  • 力扣力扣力:860柠檬水找零
  • 【机器学习监督学习】:从原理到实践,探索算法奥秘,揭示数据标注、模型训练与预测的全过程,助力人工智能技术应用与发展
  • Unity 内置枚举(Option Stencil)
  • 【AI技术赋能有限元分析应用实践】Abaqus、 Ansys、FEniCSx 有限元结合深度学习
  • Java爬虫与淘宝API接口:深度解析销量和商品详情数据获取