当前位置: 首页 > 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…...

一篇搞定2026年律所管理系统选购,避坑技巧+优质品牌全解析

据智研咨询2026年发布的《中国律所管理软件行业发展报告》显示&#xff0c;国内律所对管理系统的需求年增长率达28%&#xff0c;但近70%的律所表示选型后存在功能冗余、操作复杂、适配性差等问题&#xff0c;不仅未能提升效率&#xff0c;反而增加了办公成本。作为深耕律所管理…...

从4G到RedCap:手把手教你升级老旧工业设备的无线通信模块(附功耗测试数据)

从4G到RedCap&#xff1a;工业设备无线通信模块升级实战指南 在工业物联网快速发展的今天&#xff0c;老旧设备的通信模块升级成为许多工厂面临的现实挑战。传统4G模块虽然稳定可靠&#xff0c;但面对5G时代RedCap技术带来的低功耗、低成本优势&#xff0c;升级改造已成为提升设…...

京东云GPU服务器省钱攻略:如何根据业务需求灵活选择计费模式和虚拟化方案

京东云GPU服务器成本优化实战指南&#xff1a;精准匹配业务需求的选型策略 在AI与高性能计算领域&#xff0c;GPU服务器已成为企业技术基础设施的核心组件。然而&#xff0c;面对复杂的计费模式、多样的硬件配置以及差异化的虚拟化方案&#xff0c;许多技术决策者常常陷入"…...

基于Vue的沧交食堂食品监管系统[vue]-计算机毕业设计源码+LW文档

摘要&#xff1a;本文阐述了一个基于Vue框架开发的沧交食堂食品监管系统。该系统旨在借助现代Web技术&#xff0c;强化对沧交食堂食品安全的监管力度&#xff0c;提升监管效率与质量。系统涵盖了系统用户管理、新闻数据管理、食品相关业务管理以及评论管理等多方面功能。文章详…...

对话意图识别新选择:轻量ESFT模型高效易用

对话意图识别新选择&#xff1a;轻量ESFT模型高效易用 【免费下载链接】ESFT-token-intent-lite 基于HuggingFace平台&#xff0c;deepseek-ai团队推出的ESFT-token-intent-lite模型&#xff0c;是ESFT-vanilla-lite的精简版&#xff0c;专为意图识别优化&#xff0c;性能卓越&…...

如何用torchtext快速构建文本分类模型?5分钟上手RoBERTa与T5实战教程

如何用torchtext快速构建文本分类模型&#xff1f;5分钟上手RoBERTa与T5实战教程 【免费下载链接】text Models, data loaders and abstractions for language processing, powered by PyTorch 项目地址: https://gitcode.com/gh_mirrors/te/text 想要在PyTorch生态中快…...

3步精通FanControl:从噪音难题到智能散热的技术蜕变

3步精通FanControl&#xff1a;从噪音难题到智能散热的技术蜕变 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/F…...

QRazyBox:5分钟解决二维码修复难题的专业工具

QRazyBox&#xff1a;5分钟解决二维码修复难题的专业工具 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 二维码已经成为现代生活中无处不在的数字桥梁&#xff0c;但你是否遇到过这样的情况&…...

OpenClaw+GLM-4.7-Flash:自动化代码审查与优化建议

OpenClawGLM-4.7-Flash&#xff1a;自动化代码审查与优化建议 1. 为什么需要自动化代码审查 作为一名长期与代码打交道的开发者&#xff0c;我深知代码审查的重要性&#xff0c;但传统的人工审查存在几个痛点&#xff1a;时间成本高、标准不统一、容易遗漏细节。特别是在个人项…...

2026年小学英语学习小程序排行榜

对于小学生而言&#xff0c;英语学习早已打破“只背单词、只刷习题”的单一模式&#xff0c;听、说、读、写全方位同步训练&#xff0c;才是提升英语能力的关键。2026年&#xff0c;市面上涌现出多款优质小学英语学习小程序&#xff0c;覆盖单词记忆、听力训练、阅读提升、语法…...