创建型模式-----建造者模式
目录
背景:
构建模式UML
代码示例
房子成品:
构建器抽象:
具体构建器:
建筑师:
测试部分:
背景:
软件构建过程中有时候一个复杂的对象的构建可分解为多个子对象按照一定的算法逻辑进行构建,这种构建算法基本稳定但构建的子部件却经常变化。
创建者模式则是将构建的算法和子组件分开,将变化和不变分开,当子组件变化时只影响子组件本身不影响构建算法本身,加强了构建算法的封闭性,提升了组件的扩展性。
构建模式UML
这里以建房子为例,房子构建过程抽象为地基、墙体、屋顶和装修等4个部分。四个部分构建流程基本不变,但是四个部分所用的材料和组合等均可以变化,根据构建模式其UML图如下。
代码示例
房子成品:
这里简化为四部分。
struct House
{std::string HouseBase;std::string HouseWall;std::string HouseTop;std::string HouseDecorator;
};
构建器抽象:
class HouseBuilder
{
public:House*getHousr(){return m_house;}HouseBuilder(){m_house = new House();}~HouseBuilder(){if (m_house){delete m_house;}}virtual void buildPart1() = 0;virtual void buildPart2() = 0;virtual void buildPart3() = 0;virtual void buildPart4() = 0;
protected:House* m_house = nullptr;
};
具体构建器:
经常变化的构建,不同的房子需要不同的构建器,一套房子对应一种构建器;若有新品房子则需要重写构建器,增量开发不影响原本的构建器和建筑师建筑流程。
class StoneHouseBuilder :public HouseBuilder
{
public:void buildPart1() override { std::cout << "打水泥地基" << std::endl; m_house->HouseBase = "石头地基"; }void buildPart2() override { std::cout << "砌石头墙" << std::endl; m_house->HouseWall = "石头墙"; }void buildPart3() override { std::cout << "盖琉璃屋顶" << std::endl; m_house->HouseTop = "琉璃顶"; }void buildPart4() override { std::cout << "石灰滚刷装修,铺地装" << std::endl; m_house->HouseDecorator = "石灰滚刷装修,铺地装"; }
};class GrassHouseBuilder :public HouseBuilder
{
public:void buildPart1() override { std::cout << "木桩打地基" << std::endl;m_house->HouseBase = "木桩地基"; }void buildPart2() override { std::cout << "竹子编制墙" << std::endl; m_house->HouseWall = "竹子墙"; }void buildPart3() override { std::cout << "茅草盖屋顶" << std::endl; m_house->HouseTop = "茅草顶"; }void buildPart4() override { std::cout << "茅草遮墙做防风" << std::endl; m_house->HouseDecorator = "茅草遮墙做防风"; }
};
建筑师:
建筑流程稳定,基本不变;根据使用不同的构建器可得到不同房子的建筑师,建出不同的房子。
class HouseDirector
{
public:HouseBuilder*pHouserBuilder = nullptr;HouseDirector(HouseBuilder*pHB) :pHouserBuilder(pHB) {}House* Construct() {//构建过程稳定不变 但是构建的各个组件部分剧烈变动pHouserBuilder->buildPart1();pHouserBuilder->buildPart2();pHouserBuilder->buildPart3();pHouserBuilder->buildPart4();return pHouserBuilder->getHousr();}
};
测试部分:
void TestFun::TestBuilder()
{StoneHouseBuilder builder1;HouseDirector stone_Director(&builder1);House* pStoneHouse = stone_Director.Construct();GrassHouseBuilder builder2;HouseDirector grass_Director(&builder2);House* pgrassHouse = grass_Director.Construct();
}
相关文章:

创建型模式-----建造者模式
目录 背景: 构建模式UML 代码示例 房子成品: 构建器抽象: 具体构建器: 建筑师: 测试部…...

威胁 Windows 和 Linux 系统的新型跨平台勒索软件:Cicada3301
近年来,网络犯罪世界出现了新的、日益复杂的威胁,能够影响广泛的目标。 这一领域最令人担忧的新功能之一是Cicada3301勒索软件,最近由几位网络安全专家进行了分析。他们有机会采访了这一危险威胁背后的勒索软件团伙的成员。 Cicada3301的崛…...

Go 语言基础教程:7.Switch 语句
在这篇教程中,我们将学习 Go 语言中的 switch 语句,它是条件分支的重要结构。我们将通过一个示例程序逐步解析 switch 的不同用法。 package mainimport ("fmt""time" )func main() {i : 2fmt.Print("Write ", i, " …...

mysql原理、部署mysql主从+读写分离、监控mysql主从脚本
mysql:工作原理 从库生成两个线程,一个I/O线程,一个SQL线程; i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中; 主库会生成一个 log dump 线程&…...

模型选择拟合
1.通过多项式拟合交互探索概念 import math import numpy as np import torch from torch import nn from d2l import torch as d2l 2.使用三阶多项式来生成训练和测试数据的标签 max_degree 20 # 多项式的最大阶数 n_train, n_test 100, 100 # 训练和测试数据集大小 true…...

文案语音图片视频管理分析系统-视频矩阵
文案语音图片视频管理分析系统-视频矩阵 1.产品介绍 产品介绍方案 产品名称: 智驭视频矩阵深度分析系统(SmartVMatrix) 主要功能: 深度学习驱动的视频内容分析多源视频整合与智能分类高效视频检索与编辑实时视频监控与异常预警…...

ArcGIS计算落入面图层中的线的长度或面的面积
本文介绍在ArcMap软件中,计算落入某个指定矢量面图层中的另一个线图层的长度、面图层的面积等指标的方法。 如下图所示,现在有2个矢量要素集,其中一个为面要素,表示某些区域;另一个为线要素,表示道路路网。…...

ctfshow-web入门-web172
//拼接sql语句查找指定ID用户 $sql "select username,password from ctfshow_user2 where username !flag and id ".$_GET[id]." limit 1;"; 联合查询 该题目与上一个题目不是同一个类型,该题目需要进行sql联合查询。 第一步:确…...

Keep健身TV版 3.3.0 | 针对智能电视的健身塑形软件
Keep健身TV版是专为智能电视设计的功能强大的健身塑形软件。该软件根据用户的不同需求提供多种器械和阶段健身目标组合编排,为用户提供科学、规范、专业的实时指导。即便是在家没有健身器械的情况下,也能跟随教练的语音指导一步步完成训练。软件涵盖从有…...
推荐一些关于计算机网络和 TCP/IP 协议的书籍
以下是一些关于计算机网络和 TCP/IP 协议的优秀书籍推荐: 《TCP/IP 详解》: 作者为 W.Richard Stevens,这是一套经典之作,分为三卷。《TCP/IP 详解卷 1:协议》:详细解析了 TCP/IP 协议的工作原理和实现细节,对协议族中的各个层次和协议,如 IP、TCP、UDP 等进行了深入剖…...
生成式AI浪潮下的商业机遇与经济展望 —— 与互联网时代的比较
一、引言 近年来,生成式人工智能(AI)技术迅速崛起,不仅吸引了大量资本的关注,同时也催生了诸多创新商业模式。与互联网早期阶段类似,AI领域同样面临着前所未有的发展机遇。本文将探讨生成式AI与互联网时代的异同,并分析当前AI行业的经济状况及其增长潜力。 二、经济形…...
Go 标准库
本篇内容是根据2016年9月份The Go Standard Library音频录制内容的整理与翻译, BoltDB 的创建者 Ben Johnson 参加了节目,讨论 NoSQL 与 SQL 数据库、两者之间的权衡以及选择其中之一。我们还讨论了 Ben 的数据秘密生活项目,可视化数据结构,…...

AUTOSAR_EXP_ARAComAPI的6章笔记(5)
☞返回总目录 相关总结:AUTOSAR 通信组的使用方法总结 6.5 通信组的使用方法 6.5.1. 设置 本节描述了使用 Communication Group Template(类别为 COMMUNICATION_GROUP)定义通信组的配置步骤。定义一个通信组需要指定三个项目:…...

Photoshop中的混合模式公式详解
图层混合简介 图层混合(blend)顾名思义,就是把两个图层混合成一个。 最基本的混合是alpha融合(alpha compositing),这是一个遵循光的反射与透射等(简化版)物理学原理的混合方式。 各…...
Vue 自定义指令 Directive 的高级使用与最佳实践
前言 Vue.js 是一个非常流行的前端框架,它的核心理念是通过声明式的方式来描述 UI 和数据绑定。除了模板语法和组件系统,Vue 还提供了一个强大的功能——自定义指令。 自定义指令可以让我们对 DOM 元素进行底层操作,下面让我们通过一个有趣的…...

万字图文实战:从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: Gitee 💫 Github …...

在WebStorm遇到Error: error:0308010C:digital envelope routines::unsupported报错时的解决方案
作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:WebStorm 目录 介绍 解决 分析 方法一:设置环境变量 使用WebStorm 使用其他编译器 方法二:使用nvm切换nodejs版本 方法三:更新依赖版本 介…...
数据库产品中SQL注入防护功能应该包含哪些功能
数据库产品中 SQL 注入防护功能应包含以下几方面: 输入验证与过滤功能: 数据类型和格式验证:检查用户输入的数据是否符合预期的数据类型,比如对于一个应该是整数类型的字段,检查输入是否为整数;对于字符串…...

Ribbon客户端负载均衡策略测试及其改进
文章目录 一、目的概述二、验证步骤1、源码下载2、导入IDE3、运行前修改配置4、策略说明5、修改策略 三、最终结论四、改进措施1. 思路分析2. 核心代码3. 测试页面 一、目的概述 为了验证Ribbon客户端负载均衡策略在负载节点失效的情况下,是否具有故障转移的功能&a…...

linux网络编程5——Posix API和网络协议栈,使用TCP实现P2P通信
文章目录 Posix API和网络协议栈,使用TCP实现P2P通信1. socket()2. bind()3. listen()4. connect()5. accept()6. read()/write(), recv()/send()7. 内核tcp数据传输7.1 TCP流量控制7.2 TCP拥塞控制——慢启动/拥塞避免/快速恢复/快速重传 8. shutdown()9. close()9…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...