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

重拾设计模式--建造者模式

文章目录

  • 建造者模式(Builder Pattern)概述
  • 建造者模式UML图
  • 作用:
  • 建造者模式的结构
    • 产品(Product):
    • 抽象建造者(Builder):
    • 具体建造者(Concrete Builder):
    • 指挥者(Director):
  • C++ 代码示例1
  • C++示例代码2

建造者模式(Builder Pattern)概述

定义:
建造者模式是一种创建型设计模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。也就是说,它把对象的创建逻辑和表示逻辑分离开来,让代码结构更加清晰,便于维护和扩展。

建造者模式UML图

在这里插入图片描述

作用:

便于创建复杂对象:对于那些具有多个属性、构造过程比较复杂的对象,使用建造者模式可以分步来构建对象,使创建过程更有条理。例如,创建一个包含多个部件的电脑对象,要配置 CPU、内存、硬盘等多种组件,通过建造者模式能清晰地完成配置过程。
提高代码的可维护性和可读性:把对象构建的各个步骤封装在不同的方法中,相比于在构造函数中罗列大量参数或者在一个方法里写复杂的初始化逻辑,代码结构更加清晰,后续阅读和维护代码时更容易理解对象的构建流程。
实现不同的构建配置:可以通过不同的建造者实现来创建对象的不同配置版本,比如对于一款游戏角色,可以创建不同属性配置的角色实例,满足不同场景需求。

建造者模式的结构

产品(Product):

这是最终要创建的复杂对象,它通常包含多个部件或者属性,比如上述提到的电脑对象,其内部有 CPU、内存、硬盘等不同的成员变量来构成完整的电脑实体。

抽象建造者(Builder):

它定义了创建产品各个部件的抽象方法,以及返回最终产品对象的抽象方法。比如对于电脑的抽象建造者,会有抽象的配置 CPU、配置内存等方法,还有获取构建好的电脑的抽象方法。

具体建造者(Concrete Builder):

实现了抽象建造者中定义的抽象方法,具体地来构建产品的各个部件,按照特定的逻辑和配置完成产品的组装,每个具体建造者可以创建出具有不同配置特点的产品。

指挥者(Director):

它负责指挥建造者进行对象的构建,通过调用建造者的相关方法来按顺序完成产品的创建过程,不过它并不关心具体的构建细节,只是协调构建步骤。

C++ 代码示例1

以下以创建一个简单的电脑对象为例来展示建造者模式的代码实现:

#include<iostream>
#include<string>// 产品类:电脑
class Computer
{
private:std::string cpu;int memory;int hardDisk;
public:void setCpu(const std::string& cpu){this->cpu = cpu;}void setMemory(int memory){this->memory = memory;}void setHardDisk(int hardDisk){this->hardDisk = hardDisk;}void showInfo(){std::cout << "CPU: " << cpu << std::endl;std::cout << "Memory: " << memory << "GB" << std::endl;std::cout << "Hard Disk: " << hardDisk << "GB" << std::endl;}
};// 抽象建造者类
class ComputerBuilder
{
public:virtual void buildCpu() = 0;virtual void buildMemory() = 0;virtual void buildHardDisk() = 0;virtual Computer* getComputer() = 0;
};// 具体建造者类,创建高配电脑
class HighEndComputerBuilder :public ComputerBuilder 
{
private:Computer* computer;
public:HighEndComputerBuilder() {computer = new Computer();}void buildCpu() override{computer->setCpu("Intel Core i9");}void buildMemory() override{computer->setMemory(32);}void buildHardDisk() override{computer->setHardDisk(1024);}Computer* getComputer() override{return computer;}
};// 具体建造者类,创建低配电脑
class LowEndComputerBuilder :	public ComputerBuilder
{
private:Computer* computer;
public:LowEndComputerBuilder(){computer = new Computer();}void buildCpu() override {computer->setCpu("Intel Core i3");}void buildMemory() override {computer->setMemory(8);}void buildHardDisk() override{computer->setHardDisk(256);}Computer* getComputer() override{return computer;}
};// 指挥者类
class Director
{
private:ComputerBuilder* builder;
public:void setBuilder(ComputerBuilder* builder) {this->builder = builder;}Computer* construct(){builder->buildCpu();builder->buildMemory();builder->buildHardDisk();return builder->getComputer();}
};int main()
{Director director;// 创建高配电脑HighEndComputerBuilder highEndBuilder;director.setBuilder(&highEndBuilder);Computer* highEndComputer = director.construct();highEndComputer->showInfo();// 创建低配电脑LowEndComputerBuilder lowEndBuilder;director.setBuilder(&lowEndBuilder);Computer* lowEndComputer = director.construct();lowEndComputer->showInfo();delete highEndComputer;delete lowEndComputer;return 0;
}

在上述代码中:
Computer类就是产品类,代表要构建的电脑对象,有设置各部件属性和展示自身信息的方法。
ComputerBuilder是抽象建造者,定义了构建电脑各部件及获取电脑对象的抽象方法。
HighEndComputerBuilder和LowEndComputerBuilder是具体建造者,分别按照高配和低配的配置来构建电脑对象。
Director类作为指挥者,通过调用建造者的方法来协调完成电脑对象的构建过程,最终客户端代码(main函数中)可以方便地通过指挥者和不同的建造者配合,创建出不同配置的电脑对象,整个创建过程条理清晰,易于扩展和维护。

C++示例代码2

#include<iostream>
#include<list>
#include<string>
using namespace std;class product
{list<string>ls;
public:void add(string m_str){ls.push_back(m_str);}void show(){list<string>::iterator itr = ls.begin();for(;itr!=ls.end();++itr){cout<<*itr<<endl;}}
};
class builder
{
public:virtual void head(){};virtual void body(){};virtual void leg(){};virtual void hand(){};virtual product getresult(){product s;return s;};
};class  conbuild1:public builder
{
private:product *m_product;
public:conbuild1(){m_product = new product();}void head(){m_product->add("1的头");}void body(){m_product->add("1的身体");}void leg(){m_product->add("1的腿");}void hand(){m_product->add("1的手");}product getresult(){return *m_product;}
};class  conbuild2:public builder
{
private:product *m_product;
public:conbuild2(){m_product = new product();}void head(){m_product->add("2的头");}void body(){m_product->add("2的身体");}void leg(){m_product->add("2的腿");}void hand(){m_product->add("2的手");}product getresult(){return *m_product;}
};class director
{
public:void createpeople(builder *s){s->body();s->hand();s->leg();s->head();}
};int main()
{director s;builder *p1 = new conbuild1;builder*p2 = new conbuild2;s.createpeople(p1);product s1 = p1->getresult();s1.show();cout<<"---------------"<<endl;s.createpeople(p2);product s2 = p2->getresult();s2.show();
}

相关文章:

重拾设计模式--建造者模式

文章目录 建造者模式&#xff08;Builder Pattern&#xff09;概述建造者模式UML图作用&#xff1a;建造者模式的结构产品&#xff08;Product&#xff09;&#xff1a;抽象建造者&#xff08;Builder&#xff09;&#xff1a;具体建造者&#xff08;Concrete Builder&#xff…...

【机器学习】以机器学习为翼,翱翔网络安全创新苍穹

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在数字化浪潮汹涌澎湃的当下&#xff0c;网络安全如同守护数字世界的坚固堡垒&#xff0c;其重要性不言而喻。而机器学习技术的蓬勃…...

人工智能在VR展览中扮演什么角色?

人工智能&#xff08;AI&#xff09;在VR展览中扮演着多重关键角色&#xff0c;这些角色不仅增强了用户体验&#xff0c;还为展览的组织者提供了强大的工具。 接下来&#xff0c;由专业从事VR展览制作的圆桌3D云展厅平台为大家介绍AI在VR展览中的一些主要作用&#xff1a; 个性…...

mysql,创建数据库和用户授权核心语句

一.库操作1.创建库create database if not exists 库名 default 字符集 default 校对规则2.删除库drop database if exists 库名3.修改库的,字符集,校对规则alter databse 库名 default 字符集 default 校对规则4.查看当前使用的库seclect databse();5.查看库show databases;…...

日期区间选择器插件的操作流程

我们知道&#xff0c;在开发过程中&#xff0c;为了能够在规定时间内完成项目&#xff0c;有时候我们都会使用插件来大大提高我们的开发效率&#xff0c;有些插件是可以直接拿来用&#xff0c;但是有些插件拿过来之后是需要进行修改&#xff0c;在使用插件的时候还有很多的注意…...

【WRF教程第3.2期】预处理系统 WPS详解:以4.5版本为例

预处理系统 WPS 详解&#xff1a;以4.5版本为例 WPS 嵌套域&#xff08;WPS Nested Domains&#xff09;USGS 和 MODIS 土地利用重力波拖拽方案静态数据&#xff08;Gravity Wave Drag Scheme Static Data&#xff09;1. 什么是重力波拖拽方案&#xff08;GWDO&#xff09;静态…...

深度学习的DataLoader是什么数据类型,为什么不可用来索引

在 Python 中&#xff0c;DataLoader是torch.utils.data.DataLoader类的实例对象&#xff0c;用于加载数据&#xff0c;它本身不是一种基本数据类型&#xff0c;而是一种特殊的迭代器类型&#xff0c;主要用于按批次加载数据&#xff0c;以下是其通常不可索引的原因&#xff1a…...

物理信息神经网络(PINN)八课时教案

物理信息神经网络&#xff08;PINN&#xff09;八课时教案 第一课&#xff1a;物理信息神经网络概述 1.1 PINN的定义与背景 物理信息神经网络&#xff08;Physics-Informed Neural Networks&#xff0c;简称PINN&#xff09;是一种将物理定律融入神经网络训练过程中的先进方…...

Linux setfacl 命令详解

文章目录 Linux setfacl 命令详解一、ACL 和 setfacl 简介二、基本语法三、常用操作1. 查看 ACL2. 为用户设置权限3. 为组设置权限4. 删除 ACL 条目5. 设置默认 ACL6. 递归设置 ACL 四、示例操作1. 创建示例目录和文件2. 设置 ACL3. 验证 ACL 五、注意事项六、总结 Linux setfa…...

电商环境下的财务ERP系统架构

先介绍一下自己的工作经历&#xff0c;2002年开始进入ERP实施行业&#xff0c;专注于O记EBS系统&#xff0c;正好赶上中国经济和信息化高度发展的阶段&#xff0c;先后实施过很多大国企和民企的大型ERP项目&#xff0c;在实施过程中逐渐对ERP系统的架构、模块设计有更深入的认识…...

Linux相关概念和易错知识点(25)(信号原理、操作系统的原理、volatile)

目录 1.信号的产生 &#xff08;1&#xff09;kill &#xff08;2&#xff09;raise、abort 2.对block、pending、handler表的管理 &#xff08;1&#xff09;信号集&#xff08;sigset_t&#xff09; &#xff08;2&#xff09;block表的管理 ①操作相关的函数 ②sigpr…...

线上问题——频繁 Full GC 问题的排查思路

文章目录 一、查看 GC 日志二、分析内存泄漏三、检查对象生命周期四、优化代码五、调整垃圾回收策略六、使用监控工具 一、查看 GC 日志 启用 GC 日志 在 Java 应用中&#xff0c;需要在启动参数中添加适当的参数来启用 GC 日志记录。可以使用-XX:PrintGCDetails、-XX:PrintGCD…...

《探秘 Qt Creator Manual 4.11.1》

《探秘 Qt Creator Manual 4.11.1》 一、Qt Creator 4.11.1 概述二、功能特性全解析&#xff08;一&#xff09;跨平台能力展示&#xff08;二&#xff09;代码编辑优势&#xff08;三&#xff09;版本控制集成&#xff08;四&#xff09;特定 Qt 功能呈现&#xff08;五&#…...

level2逐笔委托查询接口

沪深逐笔委托队列查询 前置步骤 分配数据库服务器 查询模板 以下是沪深委托队列查询的请求模板&#xff1a; http://<数据库服务器>/sql?modeorder_book&code<股票代码>&offset<offset>&token<token>查询参数说明 参数名类型说明mo…...

在Linux系统安装配置 MySQL 和 hive,hive配置为远程模式

前提&#xff1a;已安装配置好了Hadoop环境&#xff0c;因为hive的底层是Hadoop 1 Mysql安装 搜索Centos7自带的mariadb rpm -qa|grep mariadb 卸载mariadb rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps 再搜索一次看看是否还存在 rpm -qa|grep mariadb 安装mysql 创…...

如何写好一份科技报告

如何写好一份技术文档 一、科技报告写作的整体框架封面与摘要&#xff1a;引言&#xff1a;理论框架与文献综述&#xff1a;实验方法与材料&#xff1a;实验结果&#xff1a;结果分析与讨论&#xff1a;结论&#xff1a;参考文献&#xff1a;附录&#xff1a; 二、科技报告写作…...

ARM学习(38)多进程多线程之间的通信方式

ARM学习(38)ARM学习(38)多进程多线程之间的通信方式 一、问题背景 笔者在调试模拟器的时候,碰到进程间通信的问题,一个进程在等另外一个进程ready的时候,迟迟等不到,然后通过调试发现,另外一个进程变量已经变化了,但是当前进程变量没变化,需要了解进程间通信的方式…...

《图解机器学习》(杉山将著)第一部分绪论学习笔记

《图解机器学习》&#xff08;杉山将著&#xff09;第一部分绪论学习笔记 《图解机器学习》&#xff08;杉山将著&#xff09;第一部分绪论学习笔记一、什么是机器学习1.1 学习的种类1.2 机器学习任务的例子1.3 机器学习的方法 二、学习模型2.1 线性模型2.2 核模型2.3 层级模型…...

【WPF】RenderTargetBitmap的使用

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;RenderTargetBitmap 是一个非常有用的类&#xff0c;它允许你将任何可视元素&#xff08;如 UIElement 或 Visual 的实例&#xff09;渲染到位图中。这在需要生成图像快照、导出可视化内容为图片文…...

编辑, 抽成组件

问题 错误思路&#xff1a; 1 dept不能修改&#xff0c; 用watch监听一下&#xff1a;赋值给新的变量进行修改&#xff0c; 问题&#xff1a; currentDept 发生改变&#xff0c; depth也发生了改变&#xff0c;因为是浅拷贝&#xff0c; 用了json.pase(json.stringify(value…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL&#xff08;Software OpenGL&#xff09;‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式&#xff08;包括几何处理、光栅化、着色等&#xff09;&#xff0c;不依赖GPU硬件加速。这种模式通常性能较低&#xff0c;但兼容性极强&#xff0c;常用于不支持硬件加速…...