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

【二】【设计模式】建造者模式

建造者模式的引入

 
//C10_1.cpp
#include <stdio.h>#include "SystemConfig.h"int main() {SystemConfig config("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda","redis://127.0.0.1/", "xiaomuredis", "xiaomuredispw","kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw");SystemConfig config2("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda","", "", "","kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw");SystemConfig config3("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda","kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw","", "", "");return 0;
}

C10_1.cpp中,首先包含了SystemConfig.h头文件以访问SystemConfig类。然后在main函数中,创建了三个SystemConfig对象,每个对象都用不同的参数初始化。这三个对象分别为configconfig2config3,它们代表不同的配置集。每个对象的构造函数都传入了MySQL、Redis和Kafka的URL、用户名和密码。在config2config3中,某些服务的参数为空字符串,表示不使用该服务。

 
//SystemConfig.h
#pragma once#include <string>class SystemConfig
{
public:SystemConfig(const std::string & _MySQL_URL, const std::string & _MySQL_USER, const std::string & _MySQL_PW,const std::string & _Redis_URL, const std::string & _Redis_USER, const std::string & _Redis_PW,const std::string& _Kafka_URL, const std::string& _Kafka_USER, const std::string& _Kafka_PW);std::string MySQL_URL;std::string MySQL_USER;std::string MySQL_PW;std::string Redis_URL;std::string Redis_USER;std::string Redis_PW;std::string Kafka_URL;std::string Kafka_USER;std::string Kafka_PW;
};

SystemConfig.hSystemConfig类的头文件。它声明了SystemConfig类及其构造函数和成员变量。构造函数接受MySQL、Redis和Kafka的URL、用户名和密码作为参数。这些参数被用来初始化对象的公共成员变量。使用#pragma once防止头文件被多次包含。

 
//SystemConfig.cpp
#include "SystemConfig.h"SystemConfig::SystemConfig(const std::string& _MySQL_URL, const std::string& _MySQL_USER, const std::string& _MySQL_PW,const std::string& _Redis_URL, const std::string& _Redis_USER, const std::string& _Redis_PW,const std::string& _Kafka_URL, const std::string& _Kafka_USER, const std::string& _Kafka_PW)
{MySQL_URL = _MySQL_URL;MySQL_USER = _MySQL_USER;MySQL_PW = _MySQL_PW;Redis_USER = _Redis_USER;Redis_URL = _Redis_URL;Redis_PW = _Redis_PW;Kafka_USER = _Kafka_USER;Kafka_URL = _Kafka_URL;Kafka_PW = _Kafka_PW;
}

SystemConfig.cppSystemConfig类的源文件。它定义了SystemConfig类构造函数内部的代码逻辑,利用接受的MySQL、Redis和Kafka的URL、用户名和密码的参数,对应的赋值给SystemConfig类的成员变量。

建造者模式

 
//C10_2.cpp
#include <stdio.h>#include "SystemConfig.h"#include "SystemConfigBuilder.h"#include "CompanyA.h"
#include "CompanyB.h"int main()
{/*SystemConfig config("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda","redis://127.0.0.1/", "xiaomuredis", "xiaomuredispw","kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw");SystemConfig config2;config2.setMySQL("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda");config2.setRedis("redis://127.0.0.1/", "xiaomuredis", "xiaomuredispw");config2.setKafka("kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw");*/SystemConfigBuilder builder; builder.setMySQL("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda");builder.setRedis("redis://127.0.0.1/", "xiaomuredis", "xiaomuredispw");builder.setKafka("kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw");SystemConfig config = builder.getSystemConfig();printf("Mysql URL: %s\n", config.MySQL_URL.c_str());printf("Mysql USER: %s\n", config.MySQL_USER.c_str());printf("Mysql PW %s\n", config.MySQL_PW.c_str());printf("Redis URL: %s\n", config.Redis_URL.c_str());printf("Redis USER: %s\n", config.Redis_USER.c_str());printf("Redis PW %s\n", config.Redis_PW.c_str());printf("Kafka URL: %s\n", config.Kafka_URL.c_str());printf("Kafka USER: %s\n", config.Kafka_USER.c_str());printf("Kafka PW %s\n", config.Kafka_PW.c_str());CompanyA companyA;SystemConfig configA = companyA.buildSystemConfig();CompanyB companyB;SystemConfig configB = companyB.buildSystemConfig();return 0;
}
 
//SystemConfig.h
#pragma once#include <string>class SystemConfig
{
public:SystemConfig();SystemConfig(const std::string & _MySQL_URL, const std::string & _MySQL_USER, const std::string & _MySQL_PW,const std::string & _Redis_URL, const std::string & _Redis_USER, const std::string & _Redis_PW,const std::string& _Kafka_URL, const std::string& _Kafka_USER, const std::string& _Kafka_PW);std::string MySQL_URL;std::string MySQL_USER;std::string MySQL_PW;std::string Redis_URL;std::string Redis_USER;std::string Redis_PW;std::string Kafka_URL;std::string Kafka_USER;std::string Kafka_PW;
};

SystemConfig.hSystemConfig类的头文件。它声明了SystemConfig类及其构造函数和成员变量。构造函数接受MySQL、Redis和Kafka的URL、用户名和密码作为参数。这些参数被用来初始化对象的公共成员变量。使用#pragma once防止头文件被多次包含。与之前的代码一致,没有发生改变。

 
//SystemConfig.cpp
#include "SystemConfig.h"SystemConfig::SystemConfig()
{}SystemConfig::SystemConfig(const std::string& _MySQL_URL, const std::string& _MySQL_USER, const std::string& _MySQL_PW,const std::string& _Redis_URL, const std::string& _Redis_USER, const std::string& _Redis_PW,const std::string& _Kafka_URL, const std::string& _Kafka_USER, const std::string& _Kafka_PW)
{MySQL_URL = _MySQL_USER;MySQL_USER = _MySQL_URL;MySQL_PW = _MySQL_PW;Redis_USER = _Redis_USER;Redis_URL = _Redis_URL;Redis_PW = _Redis_PW;Kafka_USER = _Kafka_USER;Kafka_URL = _Kafka_URL;Kafka_PW = _Kafka_PW;
}

SystemConfig.cppSystemConfig类的源文件。它定义了SystemConfig类构造函数内部的代码逻辑,利用接受的MySQL、Redis和Kafka的URL、用户名和密码的参数,对应的赋值给SystemConfig类的成员变量。

 
//SystemConfigBuilder.h
#pragma once#include "SystemConfig.h"class SystemConfigBuilder
{
public:SystemConfig config;int setMySQL(const std::string& _MySQL_URL, const std::string& _MySQL_USER, const std::string& _MySQL_PW);int setRedis(const std::string& _Redis_URL, const std::string& _Redis_USER, const std::string& _Redis_PW);int setKafka(const std::string& _Kafka_URL, const std::string& _Kafka_USER, const std::string& _Kafka_PW);SystemConfig& getSystemConfig();
};

SystemConfigBuilder.hSystemConfigBuilder类的头文件,声明了SystemConfig类成员变量,以及setMySQLsetRedissetKafka,三个成员函数,分别用来配置MySQLRedisKafka。以及getSystemConfig成员函数用来获取对应的SystemConfig类系统配置。

 
//SystemConfigBuilder.cpp
#include "SystemConfigBuilder.h"SystemConfig& SystemConfigBuilder::getSystemConfig()
{return config;
}int SystemConfigBuilder::setMySQL(const std::string& _MySQL_URL, const std::string& _MySQL_USER, const std::string& _MySQL_PW)
{config.MySQL_URL = _MySQL_USER;config.MySQL_USER = _MySQL_URL;config.MySQL_PW = _MySQL_PW;return 0;
}int SystemConfigBuilder::setRedis(const std::string& _Redis_URL, const std::string& _Redis_USER, const std::string& _Redis_PW)
{config.Redis_USER = _Redis_USER;config.Redis_URL = _Redis_URL;config.Redis_PW = _Redis_PW;return 0;
}int SystemConfigBuilder::setKafka(const std::string& _Kafka_URL, const std::string& _Kafka_USER, const std::string& _Kafka_PW)
{config.Kafka_USER = _Kafka_USER;config.Kafka_URL = _Kafka_URL;config.Kafka_PW = _Kafka_PW;return 0;
}

SystemConfigBuilder.cppSystemConfigBuilder类的源文件,对SystemConfigBuilder.h中的声明进行了定义。

 
//Director.h
#pragma once#include "SystemConfig.h"
#include "SystemConfigBuilder.h"class Director
{
public:SystemConfigBuilder builder;virtual SystemConfig& buildSystemConfig() = 0;
};

Director.hDirector导演类的头文件,我们利用SystemConfigBuilder类可以很方便地完成系统的配置,但对于不同的公司他们提供的服务不同,有些公司只需要配置MySQLKafka,有些公司只配置MySQLRedis。对于不同的公司运用SystemConfigBuilder类的情况不同,因此我们为不同的公司准备不同的调用方案,到时候只需要使用一个函数就可以完成配置。将调用函数配置行为进行封装。

Director的目的是为了封装控制SystemConfigBuilder 类,因此构造一个纯虚函数buildSystemConfig,用来表示不同公司对于SystemConfigBuilder 的使用情况。

 
//Director.cpp
#include "Director.h"
 
//CompanyA.h
#pragma once#include "SystemConfig.h"
#include "SystemConfigBuilder.h"#include "Director.h"class CompanyA : public Director
{
public:virtual SystemConfig & buildSystemConfig() override;
};
 
//CompanyA.cpp
#include "CompanyA.h"SystemConfig& CompanyA::buildSystemConfig()
{builder.setMySQL("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda");builder.setRedis("", "", "");builder.setKafka("kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw");return builder.getSystemConfig();
}

CompanyA公司只配置MySQLKafka,因此buildSystemConfig函数调用setRedis参数为空。

 
//CompanyB.h
#pragma once#include "SystemConfig.h"
#include "SystemConfigBuilder.h"#include "Director.h"class CompanyB : public Director
{
public:virtual SystemConfig& buildSystemConfig() override;
};
 
//CompanyB.cpp
#include "CompanyB.h"SystemConfig& CompanyB::buildSystemConfig()
{builder.setMySQL("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda");builder.setRedis("redis://127.0.0.1/", "xiaomuredis", "xiaomuredispw");builder.setKafka("", "", "");return builder.getSystemConfig();
}

CompanyB公司只配置MySQLRedis,因此buildSystemConfig函数调用setKafka参数为空。

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

相关文章:

【二】【设计模式】建造者模式

建造者模式的引入 //C10_1.cpp #include <stdio.h>#include "SystemConfig.h"int main() {SystemConfig config("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda","redis://127.0.0.1/", "xiaomuredis", &q…...

Linux 系统 CentOS7 上搭建 Hadoop HDFS集群详细步骤

集群搭建 整体思路:先在一个节点上安装、配置,然后再克隆出多个节点,修改 IP ,免密,主机名等 提前规划: 需要三个节点,主机名分别命名:node1、node2、node3 在下面对 node1 配置时,先假设 node2 和 node3 是存在的 **注意:**整个搭建过程,除了1和2 步,其他操作都使…...

【Python】python+requests+excel+pytest-实现接口自动化实例

目录 测试需求实现思路完整框架2.1 初始化数据 (test_data.xlsx)2.2 核心脚本 (api_client.py)2.3 测试用例 (test_interfaces.py)2.4 日志 (logging)2.5 pytest配置文件 (pytest.ini)2.6 测试报告 (pytest-html)2.7 入口函数 (run_tests.py)2.8 完整流程注意事项测试需求 简单…...

Django(四)-搭建第一个应用(3)

一、问题详情页 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>展示某个投票的问题和不带结果的选项列表</title> </head> <body><form action"{% url polls:vote questi…...

吴恩达2022机器学习专项课程(一) 4.2 梯度下降实践

问题预览/关键词 本节内容梯度下降更新w的公式梯度下降更新b的公式的含义α的含义为什么要控制梯度下降的幅度&#xff1f;导数项的含义为什么要控制梯度下降的方向&#xff1f;梯度下降何时结束&#xff1f;梯度下降算法收敛的含义正确更新梯度下降的顺序错误更新梯度下降的顺…...

SQL,group by分组后分别计算组内不同值的数量

SQL&#xff0c;group by分组后分别计算组内不同值的数量 如现有一张购物表shopping 先要求小明和小红分别买了多少笔和多少橡皮&#xff0c;形成以下格式 SELECT name,COUNT(*) FROM shopping GROUP BY name;SELECT name AS 姓名,SUM( CASE WHEN cargo 笔 THEN 1 ELSE 0 END)…...

关于python中常用命令(持续更新中)

目录 关于pip 卸载安装pip 更新pip 更换pip镜像源 清除缓存 更新指定包 指定清华镜像下载指定包 关于conda 更换清华镜像源 优先使用清华镜像 清除缓存 关于数据分析、数据挖掘常用 Matplotlib 3.6.0 文档&#xff08;绘图实例&#xff09; jupyter字体问题 jup…...

JAVA学习笔记21

1.IDEA的使用 1.ctrl B 快速定位到方法 2.ctrl Y 快速删除行 3.ctrl D 快速复制行 4.ctrl H 查看继承的层级关系 5.快速格式化代码 ctrl shift L 6.alt R 快速允许程序 7.ctrl / 快速添加注释 1.包(软件包) 1.1包的三大作用 1.区分相同名字的类 2.当类很多的…...

如何制作Word模板并用Java导出自定义的内容

1前言 在做项目时会按照指定模板导出word文档,本文讲解分析需求后,制作word模板、修改模板内容,最终通过Java代码实现按照模板自定义内容的导出。 2制作word模板 2.1 新建word文档 新建word文档,根据需求进行编写模板内容,调整行间距和段落格式后将指定替换位置留空。…...

ubuntu 安装配置samba服务器完整教程

ubuntu 安装配置samba服务器完整教程 问题描述解决方法郑重声明:本人原创博文,都是实战,均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Intel arm64 OS:ubuntu16.04 问题描述 在安卓驱动系统开发的过程中,会需要搭建服务器,又需要搭建samba服务器,下面就…...

【APP_TYC】数据采集案例天眼APP查_查壳脱壳反编译_③

是不是生活太艰难 还是活色生香 我们都遍体鳞伤 也慢慢坏了心肠 你得到你想要的吗 换来的是铁石心肠 可曾还有什么人 再让你幻想 &#x1f3b5; 朴树《清白之年》 查壳 工具介绍Frida-dexDump Frida-dexDump简介 Frida-dexDump是基于Frida的一个工具&…...

通过MobaXterm工具可视化服务器桌面

一、MobaXterm工具 MobaXterm是一款功能强大的远程连接工具&#xff0c;可以连接到各种类型的服务器&#xff0c;包括Linux、Windows和MacOS。支持多种协议&#xff0c;包括SSH、RDP、VNC和Telnet MobaXterm可以通过X11转发功能可视化服务器桌面。 二、MobaXterm工具可视化服务…...

ctf题目

目录 1.文件包含的一道题目&#xff0c;没什么难度&#xff0c; 2.一道sql注入的题目&#xff0c;伪静态 3.限制只能本地访问。 1.文件包含的一道题目&#xff0c;没什么难度&#xff0c; 但是一个点就是它这里去包含的那个文件名就是flag&#xff0c;而不是flag.php也不是f…...

git 更改仓库地址

背景&#xff1a; 项目本来在A仓库进行保管&#xff0c;研发已经开发一段时间了&#xff0c;现在切换到了新的仓库B&#xff0c;研发本地如何将仓库切换到B 解决&#xff1a; # 查看远端地址 git remote -v # 查看远端仓库名 git remote # 重新设置远程仓库 git remote s…...

GLTFExporter是一个用于将3D场景导出为glTF格式的JavaScript库。

demo案例 GLTFExporter是一个用于将3D场景导出为glTF格式的JavaScript库。下面我将逐个讲解其入参、出参、属性、方法以及API使用方式。 入参&#xff08;Input Parameters&#xff09;: GLTFExporter的主要入参是要导出的场景对象和一些导出选项。具体来说&#xff1a; s…...

消息队列经典应用场景

笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客。 在职业生涯中,笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。 这篇文章,笔者结合自己的真实经历,和大家分享消息队列的七种经典应用场景。 1 异步&解耦 笔者曾经负责某电…...

阿里云Salesforce CRM功能差异列表 - Winter‘24

阉割版的阿里云Salesforce由于技术和监管等因素与国际版的Salesforce差距很大&#xff01; 一、Winter‘ 24版差异概况&#xff1a; 1.1. 主要版本&#xff1a; 阿里云上的 Salesforce 提供两个版本&#xff0c;用于生产用途的 CN 版本&#xff08;CN Edition&#xff09;和用…...

WIN10系统下误删除了用户重启无法登录

WIN10系统下误删除了用户重启无法登录 不小心在控制面板的用户组里面删除了当前的用户&#xff0c;在电脑重启后无论怎么输入密码都提示不正确不能登录。 在选择登录的界面同时点击 shift 和重启按钮&#xff1b;在进入的界面选择“疑难问题”&#xff1b;选择进入安全模式&…...

国内ip怎么来回切换:操作指南与注意事项

在数字化时代&#xff0c;互联网已经成为我们日常生活、学习和工作中不可或缺的一部分。然而&#xff0c;随着网络应用的不断深化&#xff0c;用户对于网络环境的稳定性和安全性要求也越来越高。其中&#xff0c;IP地址作为网络中的关键标识&#xff0c;其切换与管理显得尤为重…...

day72Html

常用标签&#xff1a; 分类&#xff1a; 块级标签&#xff1a;独立成行 行级标签&#xff1a;不独立成行&#xff0c;同一行可放多个行级标 注意网页显示时&#xff0c;忽略空白字符,(回车符&#xff0c;空格&#xff0c;tab制表符&#xff09; 一&#xff09;块级标签&#xf…...

B端拓客号码核验:困局审视、技术革新与行业前行,氪迹科技法人股东号码核验系统,阶梯式价格

在B端拓客的全流程中&#xff0c;有效触达企业核心决策层是实现合作转化的关键&#xff0c;而法人、股东、董监高等群体的联系方式&#xff0c;則是搭建这一沟通链路的核心基础。号码核验作为拓客工作的前置核心环节&#xff0c;其筛选质量与效率&#xff0c;直接决定着拓客投入…...

3步告别微信单向好友:WechatRealFriends帮你轻松识别谁删了你

3步告别微信单向好友&#xff1a;WechatRealFriends帮你轻松识别谁删了你 【免费下载链接】WechatRealFriends 微信好友关系一键检测&#xff0c;基于微信ipad协议&#xff0c;看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFrie…...

大数据毕业设计 hadoop+spark+kafka+hive动漫推荐系统 动漫数据分析 可视化 漫画推荐

1、项目介绍 技术栈&#xff1a; Python语言、Django框架、SQLite数据库、Echarts可视化 、HTML、基于物品协同过滤推荐算法 &#xff08;1&#xff09;首页------不同类 型的动漫数据 &#xff08;2&#xff09;动漫类型饼图 &#xff08;3&#xff09;动漫收藏排名和不同国家…...

计算机毕业设计springboot校园互助平台 基于SpringBoot的高校学生互助服务系统 SpringBoot框架下的校园协同帮助平台

计算机毕业设计springboot校园互助平台3m6f99 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联xi 可分享近年来&#xff0c;随着互联网技术的蓬勃发展和智慧校园建设的深入推进&#xff0c;高校学生对于便…...

微软服软!被骂5年的Win11将被“整改”:告别强制更新、减少Copilot、任务栏摆放自由

整理 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;Windows 11 自 2021 年发布以来&#xff0c;因任务栏功能缩水、UI 不统一、强制网络登录以及更高的硬件门槛&#xff0c;成为用户集中吐槽的焦点。再加上近来微软猛推 AI 功能&#xff0c;Copilot 的入口…...

Kali实战:CTF杂项题必备工具全解析

1. Kali Linux与CTF杂项题简介 第一次参加CTF比赛时&#xff0c;面对五花八门的杂项题完全无从下手。直到发现Kali Linux这个"瑞士军刀"&#xff0c;才真正打开了解题新世界。Kali Linux预装了300安全工具&#xff0c;其中约20%专门用于处理隐写术、文件分析等杂项题…...

Joy-Con Toolkit:让Switch玩家掌控设备的开源管理方案

Joy-Con Toolkit&#xff1a;让Switch玩家掌控设备的开源管理方案 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit 为什么Switch玩家需要专属管理工具&#xff1f; 当你插入Switch游戏卡带时&#xff0c;是否担心…...

QT程序从Windows到ARM开发板:手把手教你解决交叉编译中的屏幕适配问题

QT程序从Windows到ARM开发板&#xff1a;手把手教你解决交叉编译中的屏幕适配问题 在嵌入式开发领域&#xff0c;QT框架因其跨平台特性和丰富的UI组件库而广受欢迎。然而&#xff0c;当我们将QT程序从熟悉的Windows环境迁移到ARM开发板时&#xff0c;往往会遇到各种意想不到的挑…...

5个维度解析:如何通过Excel可视化突破AI算法学习瓶颈

5个维度解析&#xff1a;如何通过Excel可视化突破AI算法学习瓶颈 【免费下载链接】ai-by-hand-excel 项目地址: https://gitcode.com/gh_mirrors/ai/ai-by-hand-excel 你是否也曾在学习AI算法时遇到这样的困境&#xff1a;面对满屏的数学公式感到无从下手&#xff0c;神…...

PlatformIO脚本进阶:告别修改库文件,用Python脚本精准控制FreeRTOS heap文件编译

PlatformIO脚本进阶&#xff1a;精准控制FreeRTOS堆管理文件编译的工程实践 在嵌入式开发中&#xff0c;第三方库的管理一直是个令人头疼的问题。特别是像FreeRTOS这样的实时操作系统&#xff0c;其源代码结构往往包含多个可选组件&#xff0c;开发者需要根据具体硬件和需求选择…...