【设计模式】-建造者模式
Java建造者模式:创建复杂对象的灵活构建者
在软件开发中,我们经常遇到需要创建一个复杂对象的情况。如果使用传统的构造函数进行对象创建,可能会导致构造函数参数过多,难以管理和维护。建造者模式(Builder Pattern)通过引入建造者对象来逐步构建复杂对象,使得对象的构建过程更加灵活、可控,同时还能提供更好的代码可读性和维护性。
一、原理
建造者模式的核心思想是将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。具体来说,建造者模式通过将对象的构建过程委派给不同的建造者类,每个建造者类都负责创建对象的一部分,并最终将这些部分组装成完整的对象。
它由四个主要的角色组成:产品类(Product)、抽象建造者类(Builder)、具体建造者类(ConcreteBuilder)和指导者类(Director)
- 产品类(Product):表示最终构建的对象。该类具有一些属性,可以通过设置相应的setter方法进行赋值,并且定义了一个展示产品的方法。
- 抽象建造者类(Builder):定义了产品构建的抽象方法。包括构建不同部分的方法和获取最终产品的方法,由具体建造者类来实现。
- 具体建造者类(ConcreteBuilder):继承自抽象建造者类,实现了具体的构建过程。包括构建不同部分和获取最终产品的方法。
- 指导者类(Director):负责使用具体的建造者类来构建产品。通过调用具体建造者的方法来完成产品的构造,并最终返回一个完整的产品对象。
产品类
public class Product {private String partA;private String partB;private String partC;public void setPartA(String partA) {this.partA = partA;}public void setPartB(String partB) {this.partB = partB;}public void setPartC(String partC) {this.partC = partC;}public void show() {System.out.println("Product: " + partA + ", " + partB + ", " + partC);}
}
抽象建造者类
public abstract class Builder {public abstract void buildPartA();public abstract void buildPartB();public abstract void buildPartC();public abstract Product buildProduct();
}
具体建造者类
public class ConcreteBuilder extends Builder {private Product product = new Product();@Overridepublic void buildPartA() {product.setPartA("生产线1>>>-------->产品A");}@Overridepublic void buildPartB() {product.setPartB("生产线1>>>-------->产品B");}@Overridepublic void buildPartC() {product.setPartC("生产线1>>>-------->产品C");}@Overridepublic Product buildProduct() {return product;}
}
指导者类
public class Director {public Builder construct(Builder builder) {builder.buildPartA();builder.buildPartB();builder.buildPartC();return builder;}
}
测试
public class Client {public static void main(String[] args) {// 指导者Director director = new Director();// 生产线1Builder construct = director.construct(new ConcreteBuilder());Product product = construct.buildProduct();// 显示生产了什么产品product.show();}
}
运行结果如下:

观察代码,可以发现建造者模式的流程如下:
- 第一步,创建指导者(Director)对象和具体建造者(ConcreteBuilder)对象来开始构建创建过程。
- 第二步,指导者(Director)对象根据具体的建造者类完成建造过程,调用具体建造者的方法来构建产品的各个部分。也就是其方法中的builder.buildPartA(); builder.buildPartB(); builder.buildPartC();
- 建造者将构建好的部分返回给指导者。
- 指导者最终返回一个完整的产品对象,供客户端使用。
也就说,Product这个类属性的创建,不由它自身来控制,而是由具体的指导者(Director)对象来控制
那这样感觉把一个对象的创建变得复杂化了,为什么这么做呢? 这么做有什么好处和坏处呢??
优点:
-
可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
-
通过增加新的具体建造者类,可以轻松扩展和改变产品的建造过程,符合开闭原则。
-
使用建造者模式可以隐藏产品的内部细节,对客户端来说只关心如何创建对象,而不需要关心具体的构建过程。
缺点:
-
增加了类的数量,增加了代码的复杂性。
-
对于简单的对象,使用建造者模式可能会显得繁琐。如果一个对象就那么几个字段,且其字段的使用场景比较固定,再用建造者模式就很繁琐了,还不够费劲的呢...
适用场景
-
需要创建的对象具有复杂的内部结构,创建过程需要多个步骤。
-
需要创建的对象的属性之间有一定的依赖关系。
-
需要创建的对象的表示有多种方式,可以通过建造者模式灵活配置建造过程,得到不同的表示结果。
总结
建造者模式通过将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。它可以帮助我们创建复杂的对象,并保证对象的构建过程可配置和可扩展。在实际应用中,建造者模式具有较高的灵活性和可扩展性
相关文章:
【设计模式】-建造者模式
Java建造者模式:创建复杂对象的灵活构建者 在软件开发中,我们经常遇到需要创建一个复杂对象的情况。如果使用传统的构造函数进行对象创建,可能会导致构造函数参数过多,难以管理和维护。建造者模式(Builder Pattern&am…...
【N32L40X】学习笔记14-在RT-thread系统中读取eeprom数据
eeprom 说明 eeprom介绍 AT24C01A,1K串行EEPROM:内部组织16页8字节,1K需要一个7位数据字地址进行随机字寻址。AT24C02,2K串行EEPROM:内部组织32页8字节,2K需要一个8位数据字地址进行随机字寻址。AT24C04,4K串行EEPRO…...
Python OpenCV读取并显示USB UVC摄像头
1. 安装Python, 略。 2. 安装 OpenCV: pip install opencv-python 3. 预览摄像头画面脚本: import cv2cap cv2.VideoCapture(0, cv2.CAP_DSHOW)if not (cap.isOpened()):print("Could not open video device")cap.set(cv2.CAP_PR…...
针对高可靠性和高性能优化的1200V碳化硅沟道MOSFET
目录 标题:1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance摘要信息解释研究了什么文章创新点文章的研究方法文章的结论 标题:1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance 摘要 本文详…...
在服务器上搭建gitlab
最终效果展示: 官方文档: 安装部署GitLab服务 1.在服务器上下载gitlab wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.9.0-ce.0.el7.x86_64.rpm rpm -ivh gitlab-ce-12.9.0-ce.0.el7.x86_64.rpm 2.编辑站点位置 vim …...
Amazon Aurora Serverless v2 正式发布:针对要求苛刻的工作负载的即时扩展
我们非常兴奋地宣布,Amazon Aurora Serverless v2 现已面向 Aurora PostgreSQL 和 MySQL 正式发布。Aurora Serverless 是一种面向 Amazon Aurora 的按需自动扩展配置,可让您的数据库根据应用程序的需求扩展或缩减容量。 亚马逊云科技开发者社区为开发者…...
nginx的优化和防盗链 重要!!!
实验一、隐藏版本号 要把nginx的版本号隐藏起来,防止恶意攻击 方法一:修改配置文件 在http模块中加入一个命令 server_token off; 过程: 备份,改配置文件一定要备份 修改配置文件 在http模块中添加 server_tokens …...
十五.redis缓存穿透,击穿,雪崩
redis哨兵模式 一.缓存穿透1.概念2.解决方案1)接口校验2)缓存空值3)布隆过滤器4)实时监控 二.缓存击穿1.概念2.解决方案1)设置热点数据永不过期2)加互斥锁3)”提前“使用互斥锁 / 逻辑过期4&…...
Spring源码——初识Spring容器
Spring源码之工厂(容器) 为什么把Spring的工厂又叫做容器呢? 工厂的责任是创建对象,但是创建完对象后还要进行存储(针对于单例的对象来讲),以供其他地方使用,这就是容器。为了能存…...
arcgis--数据库构建网络数据集
1、打开arcmap软件,导入数据,如下: 该数据已经过处理,各交点处均被打断,并进行了拓扑检查。 2、在文件夹下新建文件数据库,名称为路网,在数据库下新建要素类,并导入道路shp文件&…...
华为OD机试真题【西天取经】
1、题目描述 【西天取经】 唐僧师徒四人去西天取经,一路翻山越岭。一日,师徒四人途径一个 mxn 长方形区域,已知 1.将取经队伍作为一个整体,4 人行走相同路线。 2.取经队伍的起点为该长方形区域的左上角,目的地为该长方…...
心电信号时域特征分析与Python实现
目录 1 引言 2 心电信号时域特征的含义 3 Python实现心电信号时域特征提取 4 结论 1 引言 心电信号是由心脏电活动引起的电信号...
认识MyBatis 之 MyBatis的动态SQL
前言 本篇介绍MyBatis里如何使用动态SQL,了解如何去简单使用动态标签;如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录 前言MyBatis - 动态 SQLif标签trim标签where标签update set 标签delet…...
【项目 计网2】4.4网络模型 4.5协议 4.6网络通信的过程
文章目录 4.4网络模型OSI七层参考模型TCP/IP四层模型(常用)简介四层介绍 4.5协议简介常见协议UDP协议TCP协议IP协议以太网帧协议(MAC地址封装)ARP协议(IP->MAC) 4.6网络通信的过程封装分用 4.4网络模型 …...
redis入门3-在java中操作redis
Redis的java客户端 Jedis、Lettuce、Redisson、以及spring提供的spring data redis Jedis操作redis //添加依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version> </dep…...
网络安全预警分类流程
网络安全预警指南 随着信息技术的广泛应用与快速发展,传统业务与信息系统的融合程度不断加深,网络安全对国家政治、经济、文化、公共服务活动的影响进一步增大。网络安全形势日趋复杂,安全威胁不断变化,利用网络漏洞、恶意程序从…...
SpringBoot复习:(20)如何把bean手动注册到容器?
可以通过实现BeanDefinitionRegistryPostProcessor接口,它的父接口是BeanFactoryPostProcessor. 步骤: 一、自定义一个组件类: package com.example.demo.service;public class MusicService {public MusicService() {System.out.println(&q…...
VLT:Vision-Language Transformer用于引用的视觉语言转换和查询生成分割
摘要 在这项工作中,我们解决了引用分割的挑战性任务。引用分割中的查询表达式通常通过描述目标对象与其他对象的关系来表示目标对象。因此,为了在图像中的所有实例中找到目标实例,模型必须对整个图像有一个整体的理解。为了实现这一点&#…...
【开源项目--稻草】Day04
【开源项目--稻草】Day04 1. 续 VUE1.1 完善VUEAJAX完成注册功能 Spring验证框架什么是Spring验证框架使用Spring-Validation 稻草问答-学生首页显示首页制作首页的流程开发标签列表标签列表显示原理 从业务逻辑层开始编写控制层代码开发问题列表开发业务逻辑层开发页面和JS代码…...
【数模】奇异值分解SVD和图形处理
介绍奇异值分解在图形压缩中的运用,并将简单介绍下Matlab对于图形和视频的处理 一、奇异值分解介绍 1.1 基本概念 奇异值分解(Singular Value Decomposition,以下简称SVD)是线性代数中一种重要的矩阵分解: U和V都是正交矩阵∑是奇异值矩阵&…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...
