二十三种设计模式之建造者模式(类比汽车制造厂好理解一些)
目录
1. 设计模式的分类
2. 定义
3. 建造者模式通常包含以下几个角色
4. 示例代码
5. 建造者模式的主要优点
1. 设计模式的分类
创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。
结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。
行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式、备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式。
2. 定义
建造者模式(Builder Pattern)是一种用来构建复杂对象的设计模式,它能够让你分步骤创建复杂对象,并允许你只通过必要的步骤来构建对象。建造者模式是创建型模式之一,它提供了一种创建对象的最佳方式。
为了大家更好理解,这里类比汽车制造厂,车辆的组装过程可以看作是建造者模式的应用。汽车的底盘、引擎、内饰等部件(组件)被逐步组装起来,形成一辆完整的汽车(产品)。不同的车型可能需要不同的组装步骤,但组装线(建造过程)保持一致。
像这样的类比还有:乐高积木、电脑组装等等。
3. 建造者模式通常包含以下几个角色
- 产品(Product):需要构建的复杂对象。
- 抽象建造者(Builder):创建一个Product对象的接口或抽象类,定义创建复杂对象的各个步骤。
- 具体建造者(ConcreteBuilder):实现Builder接口,针对不同的商业逻辑创建产品对象。
- 指挥者(Director):负责安排已有模块的顺序,然后告诉Builder开始建造。
- 客户端(Client):客户端代码一般会使用Director来构建一个复杂的对象,并提供一个或多个Builder来创建特定类型的产品。
4. 示例代码
4.1 产品类
public class Product {private String partA;private String partB;public String getPartA() {return partA;}public void setPartA(String partA) {this.partA = partA;}public String getPartB() {return partB;}public void setPartB(String partB) {this.partB = partB;}@Overridepublic String toString() {return "Product{" +"partA='" + partA + '\'' +", partB='" + partB + '\'' +'}';}
}
4.2 抽象建造者
public interface Builder {void buildPartA();void buildPartB();Product getResult();
}
4.3 具体建造者
public class ConcreteBuilder implements Builder{private Product product;public ConcreteBuilder() {this.product = new Product();}@Overridepublic void buildPartA() {product.setPartA("PartA");}@Overridepublic void buildPartB() {product.setPartB("PartB");}@Overridepublic Product getResult() {return product;}
}
4.4 指挥者
public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public void construct() {builder.buildPartA();builder.buildPartB();}public Product getProduct() {return builder.getResult();}
}
4.5 客户端代码
public class Main {public static void main(String[] args) {Builder builder = new ConcreteBuilder();Director director = new Director(builder);director.construct();Product product = director.getProduct();System.out.println(product);}
}
4.6 运行结果

5. 建造者模式的主要优点
- 分离对象的构建和表示:建造者模式可以将对象的构建过程和表示分离,使得相同的构建过程可以创建不同的表示。
- 相同的构建过程可以创建不同的产品:通过不同的建造者,可以使用相同的构建过程创建不同的产品。
- 更复杂的对象构建:可以逐步构建复杂对象,每一步都允许你只添加你所需要的部分。
相关文章:
二十三种设计模式之建造者模式(类比汽车制造厂好理解一些)
目录 1. 设计模式的分类 2. 定义 3. 建造者模式通常包含以下几个角色 4. 示例代码 5. 建造者模式的主要优点 1. 设计模式的分类 创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。 结构型模式(七种):适配器模式、代…...
macos 系统文件操作时提示 Read-only file system 解决方法
这个情况是因为文件系统为只读, 需要我们执行一下命令重新将系统文件挂载为读写模式, 命令如下: sudo mount -uw / 这里的 mount 就是硬盘挂载命令, 后面的 -uw选项说明如下, 最后的 / 表示的是跟目录, 可以指定要修改的挂载路径,也可以默认. -u -u标志表示应更改已装载文…...
银行业务架构指导应用架构规划及设计方法
摘要 业务架构指导应用架构设计方法是指依托业务架构设计成果,开展应用架构应用划分设计、IT服务分层设计和数据模型设计的方法。通过业务架构指导应用架构设计,以IT研发项目驱动的方式,由IT系统落地业务架构设计成果,实现对业务流程快速拼接和产品灵活配置的支持,从而提升…...
最全面IO流介绍
1.字符集介绍 标准ASCII字符集:使用1个字节存储一个字符,首尾是0,总可以表示128个字符。是美国信息交换标准代码,包含英文、符号等等。 GBK汉字编码字符集,包含2万多个汉字等字符,GBK中一个中文字符编码成…...
fastadmin 文件上传腾讯云
1-安装腾讯云SDK composer require qcloud/cos-sdk-v5 2-腾讯云配置 <?phpnamespace app\common\controller;use Qcloud\Cos\Client; use think\Controller; use think\Db;class Tencent extends Controller {/*** 上传文件* param $config* param $key* return array*/p…...
《机器学习》—— PCA降维
文章目录 一、PCA降维简单介绍二、python中实现PCA降维函数的介绍三、代码实现四、PCA降维的优缺点 一、PCA降维简单介绍 PCA(主成分分析,Principal Component Analysis)是一种常用的数据降维技术。它通过线性变换将原始数据转换到新的坐标系…...
植物三萜皂苷生物合成途径及调控机制研究进展-文献精读48
摘要 三萜皂苷(triterpenoids saponins)是由三萜皂苷元和一个或多个糖基和/或其他化学基团缩合而成的一系列结构多样的天然化合物[1], 主要分布在五加科、蝶形花科、石竹科、桔梗科、毛茛科、玄参科、葫芦科等植物中[2]. 植物中三萜皂苷常分布在特定的器官和组织, 如人参(Pana…...
server 2016搭建FTP服务
目录 一、实验环境 二、在server 2016上面安装FTP服务 三、在server 2016上面配置FTP服务 四、创建用户(也可创建用户组,给用户组赋予权限) 一、实验环境 windows server 2016用于安装ftp服务 windows 10作为客户端进行测试。 二、在s…...
物理学基础精解【4】
文章目录 运动和力质点运动机械运动的参考系运动的相对性运动学中坐标系 参考文献 运动和力 质点运动 一个物体相对于另一个物体的位置或一个物体的某些部分相对于其他部分的位置 ,随着时间而变化的过程,叫机械运动 。质点是一个物理学中的理想化模型&…...
【区块链 + 人才服务】Blockchain Workshop- 区块链编程实践平台 | FISCO BCOS应用案例
Blockchain Workshop v2.0(以下简称 BCW v2.0)是点宽网络科技有限公司升级的全新区块链实践教育平台产品。 BCW v2.0 区块链实践教育平台面向高校区块链专业人才培养,用于区块链专业技术学习和智能合约编程学习,平台基于 FISCO BC…...
Java面试篇基础部分-Java中常用的I/O模型
阻塞I/O模型 阻塞式的I/O模型是一种非常常见的I/O模型机制,在进行数据读写操作的时候,客户端会发生阻塞等待。 工作流程如图所示,该用户线程一直阻塞,等待内存中的数据就绪;内存中的数据就绪之后,内核态的数据将拷贝到用户线程中,并且返回I/O的执行结果到用户线程。这个…...
如何使用python运行Flask开发框架并实现无公网IP远程访问
文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程语…...
第三届828 B2B企业节开幕,大腾智能携手华为云共谱数字化新篇章
8月27日,由华为携手上万家伙伴共同发起的第三届828 B2B企业节在贵州正式开幕。 本届企业节推出上万款数智产品,600多个精选解决方案,旨在融通数智供需,加速企业智改数转,助推中国数智产业实力再升级。中共贵州省委副书…...
Linux网络编程IO管理
网络 IO 涉及到两个系统对象,一个是用户空间调用 IO 的进程或者线程,一个是内核空间的内核系统,比如发生 IO 操作 read 时,它会经历两个阶段: 等待内核协议栈的数据准备就绪;将内核中的数据拷贝到用户态的…...
SpringCloud集成ELK
1、添加依赖 <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>6.1</version> </dependency>2、在logback-spring.xml中添加配置信息(logback-sp…...
【卷起来】VUE3.0教程-06-组件详解
各位看官,点波关注和赞吧 组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构: 这和我们嵌套 HTML 元素的方式类似,Vue 实现了自己的…...
JS Web
Web API 元素通用属性 元素自身属性 事件处理...
【Linux】传输层协议——UDP
零、传输层的作用是负责数据能够从发送端传输到接收端 一、再来认识一下端口号 端口号(Port)标识了一个主机进行通信的不同的应用程序。在TCP/IP协议中,用“源IP”,“源端口号”,“目的IP”,“目的端口号”…...
算法学习攻略总结 : 入门至进阶,通关之路指南
❃博主首页 : <码到三十五> ☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 : <搬的每块砖,皆为峰峦之基;公众号搜索(码到…...
《卷积神经网络 CNN 原理探秘》
CNN基本原理详解 卷积神经网络(Convolutional Neural Network,简称CNN),是一种前馈神经网络,人工神经元可以响应周围单元,可以进行大型图像处理。卷积神经网络包括卷积层和池化层。 卷积神经网络是受…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...
