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

devtools/2024/11/26 15:40:48/

下面是一个使用抽象工厂模式来创建和配置桥接模式的示例,场景是创建不同操作系统的窗口(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.ppmy.cn/devtools/137151.html

相关文章

【运维】 使用 shell 脚本实现类似 jumpserver 效果实现远程登录linux 服务器

实现效果 通过序号选择登录&#xff1a; 配置证书登录 配置证书登录可以免去每次都输入密码的麻烦。详见另一篇博文&#xff1a; 【ssh】使用秘钥对&#xff08;公钥/私钥&#xff09;登录linux主机以及原理介绍 自动登录脚本 直接复用以下脚本即可&#xff0c;在 server…

排序算法 时间复杂度、空间复杂度

一、时间复杂度 1. 什么是时间复杂度 记为大O&#xff0c;是衡量算法运行效率的重要指标&#xff0c;描述了算法运行所需时间是如何随着输入规模&#xff08;通常用n来表示&#xff09;变化的&#xff08;一般&#xff09;。也可以说用来表示算法语句总的执行次数随n的增长趋…

docker 卸载与安装

卸载 查询之前安装的docker, 没有查到则不用卸载删除 yum list installed | grep docker 卸载安装包 yum remove docker-* -y 删除镜像、容器、默认挂载卷 rm -rf /var/lib/docker 安装 -ce 安装稳定版本 -y 当安装过程提示选择全部为 "yes" yum install d…

Enhancing K8s Gateway API with Easegress Without Changing a Single Line of Code

In the article “Revolutionize Your Kubernetes Experience with Easegress: Kubernetes Gateway API”, we explored the powerful capabilities of the Kubernetes Gateway API. Today, we will present how to use the flexibility of Kubernetes Gateway to enhance its …

A046-基于SpringBoot的论坛系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

电脑开启虚拟化的方法

因为最近在用模拟器玩游戏&#xff0c;所以来给大家分享一下&#xff0c;使用模拟器之前需要开启的虚拟化技术。 Windows系统开启Hyper-V功能 Windows 11&#xff1a; 按【Win】【i】打开系统设置。在【系统】一栏找到并点击【可选功能】。在界面最下方找到相关设置选项的【更…

学习threejs,使用设置bumpMap凹凸贴图创建褶皱,实现贴图厚度效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshPhongMaterial高…

JavaScript的基础数据类型

一、JavaScript中的数组 定义 数组是一种特殊的对象&#xff0c;用于存储多个值。在JavaScript中&#xff0c;数组可以包含不同的数据类型&#xff0c;如数字、字符串、对象、甚至其他数组。数组的创建有两种常见方式&#xff1a; 字面量表示法&#xff1a;let fruits [apple…