创建型——建造者(Builder)day06

建造者模式 (Builder Pattern) 建造者模式是处理复杂对象创建的强大工具,它将对象的构建过程与表示分离,提供了灵活且清晰的对象创建方式。 阅读详情

分离复杂对象的构建和表示
同样的构建过程可以创建不同的表示

建造者模式和模板方法模式非常像
建造者模式强调构造对象
模板方法模式强调方法执行

基本介绍

1、建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
2、建造者模式是一步一步创建一个复 杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

建造者的四个角色

1、Product (产品角色) :一个具体的产品对象。
2、Builder (抽象建造者) :创建一个Product对象的各个部件指定的接口/抽象类.
3、ConcreteBuilder (具体建造者) :实现接口,构建和装配各个部件。
4、Director (指挥者) :构建一个使 用Builder 接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

建造者原理类图

在这里插入图片描述

盖房子例子

  • 需要建房子:这一过程为打桩、砌墙、封顶
  • 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的.

传统方式实现

在这里插入图片描述

以下代码直接根据类图在编辑器里敲打的,没有在eclipse上运行过。不保证无错可以运行

public abstract class AbstractHouse{
	//打地基
	public abstract void buildBasic();
	//砌墙
	public abstract void buildWalls();
	//封顶
	public abstract void roofed();

	public void build(){
		buildBasic();
		buildWalls();
		roofed();
	}
}
public class CommonHouse extends AbstractHouse{
	@Override
	public void buildBasic(){
		System.out.println("普通房子打地基");
	}
	//砌墙
	public void buildWalls(){
		System.out.println("普通房子砌墙");
	}
	//封顶
	public abstract void roofed(){
		System.out.println("普通房子封顶");
	}

}
public class HighHouse extends AbstractHouse{
	@Override
	public void buildBasic(){
		System.out.println("高楼打地基");
	}
	//砌墙
	public void buildWalls(){
		System.out.println("高楼砌墙");
	}
	//封顶
	public abstract void roofed(){
		System.out.println("高楼封顶");
	}

}
public class Client{
	public static void main(String[] args){
		CommonHouse commonHouse = new CommonHouse();
		commonHouse.build(); 
	}
}
  • 优点:比较好理解,简单易操作
  • 设计的程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好.也就是说,这种设计方案,把产品(即:房子)和创建产品的过程(即:建房子流程)封装在一起,耦合性增强了.
  • 解决方案:将产品和产品建造过程解耦=> 建造者模式.

使用建造者模式

类图

在这里插入图片描述

package com.xhl.Builder;

public class House {
	private String baise;
	private String wall;
	private String roofed;
	public String getBaise() {
		return baise;
	}
	public void setBaise(String baise) {
		this.baise = baise;
	}
	public String getWall() {
		return wall;
	}
	public void setWall(String wall) {
		this.wall = wall;
	}
	public String getRoofed() {
		return roofed;
	}
	public void setRoofed(String roofed) {
		this.roofed = roofed;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "House["+
				"baise:"+baise+
				",wall:"+wall+
				",roofed:"+roofed+
				"]";
	}
	
}
package com.xhl.Builder;

public abstract class HouseBuilder {
	protected House house = new House();
	
	public abstract void buildBasic();
	public abstract void buildWalls();
	public abstract void roofed();
	
	public House buildHouse() {
		return house;
	}
}

package com.xhl.Builder;

public class CommentHouse extends HouseBuilder {

	@Override
	public void buildBasic() {
		// TODO Auto-generated method stub
		System.out.println("普通房子的地基打5米");
		house.setBaise("5米");
	}

	@Override
	public void buildWalls() {
		// TODO Auto-generated method stub
		System.out.println("普通房子的墙砌10cm");
		house.setWall("10cm");
	}

	@Override
	public void roofed() {
		System.out.println("普通房子屋顶");
		house.setRoofed("普通");
	}

}

package com.xhl.Builder;

public class HighBuilding extends HouseBuilder {

	@Override
	public void buildBasic() {
		// TODO Auto-generated method stub
		System.out.println("高楼的地基打100米");
		house.setBaise("100米");
	}

	@Override
	public void buildWalls() {
		// TODO Auto-generated method stub
		System.out.println("高楼的墙砌20cm");
		house.setWall("20cm");
	}

	@Override
	public void roofed() {
		System.out.println("高楼的透明屋顶");
		house.setRoofed("透明");
	}

}
package com.xhl.Builder;

public class HouseDirector {
	HouseBuilder houseBuilder = null;

	public HouseDirector(HouseBuilder houseBuilder) {
		super();
		this.houseBuilder = houseBuilder;
	}

	public void setHouseBuilder(HouseBuilder houseBuilder) {
		this.houseBuilder = houseBuilder;
	}
	
	//指挥者构建房子流程
	public House constructHouse() {
		houseBuilder.buildBasic();
		houseBuilder.buildWalls();
		houseBuilder.roofed();
		return houseBuilder.buildHouse();
	}
}

package com.xhl.Builder;

public class HouseDome {

	public static void main(String[] args) {
		//盖普通房子
		CommentHouse commentHouse = new CommentHouse();
		//准备创建房子的指挥者
		HouseDirector houseDirector = new HouseDirector(commentHouse);
		
		//完成盖房,返回产品(房子)
		House house = houseDirector.constructHouse();
		System.out.println(house);
		
		System.out.println("-----------");
		
		HighBuilding highBuilding = new HighBuilding();
		houseDirector.setHouseBuilder(highBuilding);
		
		System.out.println(houseDirector.constructHouse());
	}

}

在这里插入图片描述

建造者模式在JDK的应用和源码分析

1、java.lang.StringBuilder中的建造者mos
在这里插入图片描述
在这里插入图片描述
例如append(String)这个方法就已经实现了
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • Appendable接口定义了多个append方法(抽象方法),即Appendable为抽象建造者,定义了抽象方法
  • AbstractStringBuilder实现了Appendable 接口方法,这里的AbstractStringBuilder 已经是建造者, 只是不能实例化
  • StringBuilder即充当了指挥者角色,同时充当了具体的建造者,建造方法的实现是由AbstractStringBuilder 完成,而StringBuilder继承 了AbstractStringBuilder

建造者模式的注意事项

  1. 客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
  2. 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象
  3. 可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程
    在这里插入图片描述
    在这里插入图片描述
  4. 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”
  5. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  6. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,因此在这种情况下,要考虑是否选择建造者模式.
  7. 抽象工厂模式VS建造者模式
    抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品
设计模式-组合模式和建筑者模式详解 (1). 定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。(2). 优点:A. 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;B. 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;(3). 缺点A. 设计较复杂,客户端需要花更多时间理清类之间的层次关系;B. 不容易限制容器中的构件。 阅读详情

相关推荐

Power BI Report Builder实战指南:分页报表从入门到企业级交付

分页报表(Paginated Reports)是面向企业正式交付场景的专业报表形态,其核心基于RDL报表定义语言,继承自SSRS技术栈,强调格式锁定、精确分页与批量导出能力。相比Power BI Desktop的交互式可视化,它更侧重PDF/Excel/Word等可归档、可嵌入、可审计的静态文档输出,在财务月报、合规底稿、合同单据等刚性格式需求中不可替代。技术价值体现在服务端数据聚合、参数化批量生成、像素级布局控制及SSRS兼容的嵌入能力。典型应用场景包括固定版式导出、百万级数据分户报表、ERP/SAP系统

weixin_30522183的博客 551

【设计模式——学习笔记】23种设计模式——建造者模式Builder(原理讲解+应用场景介绍+案例介绍+Java代码实现)

讲解建造者模式的思想,介绍其常见的应用场景,举例说明建造者模式的实现方式

我只管埋头前行,剩下的交给时间。 1万+

Power BI Report Builder企业级分页报表实战指南

分页报表(Paginated Reports)是企业合规交付的核心技术形态,依托SSRS渲染引擎实现PDF/Excel等固定布局文档的精准生成。其核心原理在于声明式排版——通过表达式控制页眉页脚、条件格式、分页逻辑与数据绑定,确保财务归档、审计报送等场景下零误差、零歧义。相比Power BI Desktop的交互式分析定位,Report Builder专注‘数据驱动文档’的确定性输出,天然支持行级安全(RLS)、参数化筛选与自动化订阅,成为金融、制造、医疗等行业报表标准化落地的关键工具。本文聚焦从零构建可签

abxlep7702的博客 698

设计模式第10讲——建造者模式(Builder)

建造者模式是一种创建型设计模式,也叫生成器模式。一、什么是建造者模式 二、角色组成 三、优缺点 四、应用场景4.1 生活场景4.2 java场景 五、代码实现5.0 UML类图5.1 产品类(Product)5.2 抽象建造者(Builder)5.3 具体构建者(ConcreteBuilder)5.4 指导者(Director)5.5 testBuilder六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 2万+

设计模式(五)——建造者模式详解

组装的过程相当于构建主机对象的过程,而组装好的主机就相当于对象的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。从而可以构建复杂的对象。这个模式适用于:某个对象构建复杂的情况。 由于实现了构建和装配的解耦,不同的构建器,相同的装配,也可以做出不同的对象,相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法,装配算法的解耦,实现了更好的复用。 建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需指定复杂对象的类型就可以得到该对象,而

壹升茉莉清的博客 1315

抖音风控参数‘bd-ticket-guard-client-data’深度解析:从X.509证书到请求签名的完整链路

本文深度解析抖音风控参数‘bd-ticket-guard-client-data’的技术实现,从X.509证书体系到请求签名的完整安全链路。通过Python代码示例,揭示证书生成、签名算法及票据封装等核心机制,帮助开发者理解现代平台风控系统的多层防御架构设计。

weixin_42525738的博客 432

Day06【API、String、String Builder】上课

1.API讲解(掌握) 1.概念介绍 英文全称:application programming interface 应用程序接口。就是帮助文档。 我们重点去学习如何查阅API. 2.如何使用API 使用步骤: 1.打开api 5.进入到要查找的类或者接口界面之后查看里面的内容: ​ 看包,看属于哪个包 注意:在java中只有java.lang包下的内容不用导包。 看类(是否是抽象的,是否能被继承。。) 继承和实现关系 看构造方法:是否可以创建对象 看方法:这是重点

weixin_43525993的博客 149

FFmpeg魔改指南:让RTMP协议完美兼容H265的三种方法(含SRS适配技巧)

本文详细介绍了三种让RTMP协议兼容H265编码的FFmpeg魔改方案,包括基于官方补丁的标准改造、Intel的SVT-HEVC集成方案以及金山云的自定义扩展方案。文章重点解析了各方案的实现原理与适配技巧,并提供了在SRS 6.0服务器上进行深度配置和性能调优的完整实战指南,帮助开发者解决H265推流至传统RTMP服务器的兼容性问题。

weixin_29290947的博客 194

苍穹外卖Day06笔记

build()是 Lombok@Builder注解的产物,用于简化对象创建;微信小程序登录核心是wx.login()获取 code → 后端调用微信接口换 openid;前端通过发起请求,Nginx 可统一转发前端静态资源和后端接口;FastJSON 核心是(JSON转对象)和(对象转JSON);@Option主要用于命令行参数解析,非Java/Spring原生注解。

sheeta1998的博客 412

开源TMS系统cortex-tms私有化部署与二次开发实战指南

运输管理系统(TMS)是现代物流数字化的核心组件,它通过将线下零散的物流操作转化为线上标准化、可追溯的数据流,实现订单、调度、跟踪与结算的全流程管理。其技术原理通常基于微服务架构,采用Spring Boot、Vue.js等成熟技术栈构建,确保系统的稳定性和可扩展性。TMS的技术价值在于显著提升物流企业的运营效率、降低成本并增强过程可控性,尤其适用于中小型物流企业实现从手工管理到系统化管理的跨越。在应用场景上,TMS广泛应用于车队管理、订单跟踪和财务结算等环节。本文聚焦于开源TMS项目cortex-tms,深

weixin_42523907的博客 746

密码学:一文看懂Base64算法

Base64常常在我们开发中出现,我们可能只知道它是一串乱码(看不懂的符号),知道有时候知道我们需要把一些数据进行base64编码,有时候需要进行Base64解码。但是却不知道它的作用是什么?它存在的意义是什么?还有它是如何生成的?如何编码和解码?上述的疑问相信在你读完本篇文章之后烟消云散。下面开始正文。Base64是什么?它和加密解密操作有什么关系吗?没错,这就是经过Base64编码后的字符串。对它解码后,我们获得以下内容点个关注,是对我持续创作的最大的鼓励!

Shujie 1万+

Java基础——Day16——包装类和StringBuffer/Builder

Day16笔记 一、包装类(掌握) 1.1 定义 java中的一个专业名词 表示java中基本数据类型对应的引用数据类型 包装类提供一些方法,可以获取对应类型数据的常量、操作转换数据的方法 1.2 包装类分类 基本类型 包装类型 byte Byte short Short int Integer long Long float Float double Double boolean Boolean char Character 二、Integer(掌握)

夏天的风清澈的酒 198

用Cursor+Node.js零代码搭建健康数据仪表盘:从数据录入到可视化全流程

本文详细介绍了如何利用Cursor AI编程助手和Node.js,无需手动编写代码,即可构建个人健康数据仪表盘的全流程。通过自然语言指令,实现从数据录入、存储到动态图表可视化的完整系统,展示了AI驱动开发在降低技术门槛、提升开发效率方面的强大能力。

gitlab7runner的博客 698

day06:缓存商品、购物车

写了缓存商品和购物车相关代码

m0_69266818的博客 946

【硬件自锁开关】用两个D触发器完成实用的自锁开关电路

性价比是做电子设计的人要考虑的事,在学会了用单片机解决大多数问题的时候,是否你也想过用简单的手段解决一个多数场合要解决的问题呢?按一下,输出状态由关闭变成开启,再按一下开启变成关闭。机械弹簧式的开关可以实现自锁的功能:钩子和弹簧将当前状态“储存”起来,这个能量为下一次触发的提供状态“翻转”的动力;在电子设计中,经常通过单片机的程序指令实现自锁:通过寄存器将当前电平状态暂存起来,下一次触发的时候寄存器内容“取反”,再将其输出到端口。可否用电路实现以上过程呢?完全可以,方案很简单,通过两个D触发器即可实现。

qq_33175704的博客 4254

SDN — EVPN Overlay 控制面

完成控制面的配置后,当 VxLAN L2 Gateway(e.g. Leaf1)再收到从 Host1 向 Host2 发出的 ARP Request 时,就会先查看自己的 ARP 广播抑制表,发现有 Host2 的 MAC-IP 记录,则直接将 ARP Request 报文中的广播 MAC 地址替换为目的单播 MAC 地址(广播变单播),然后原路 Reply,从而达到 ARP 广播抑制的目的。手动配置的方式虽然简单,但网络中会存在大量的 BUM 洪泛流量,网络扩展性也受到了限制,并不适用于大规模组网场景。

烟云的计算 1859

day06 类与类之间的关系和Stringbuffer和Stringbuilder

UML(Union Modeling Language, 统一建模语言),在面向对象分析与设计阶段使用的一种图形化设计语言 画UML图的工具常用 的有: Rational Rose, Visio, Star UML 在java开发中,我们通常展示两个类之间的关系采用UML图形 1.类与类之间的关系 1.继承(也叫做泛化) 子类继承父类, 子接口继承父接口 2.实现关系 通常指类实现接口 3...

木兮兮 189

042、双管反激的电压应力优势

【摘要】本文通过300W工业电源炸管案例,对比分析了单管与双管反激拓扑的电压应力差异。单管反激因漏感能量难以处理,尖峰电压可达1180V,需依赖RCD吸收电路但效率低下;双管反激通过钳位二极管将漏极电压限制在输入电压水平(实测650V),能量回馈使效率提升2-3%。虽增加两个MOS管,但可选用600V器件(单管需1200V),总成本反降15%以上。作者建议150W以上或高压输入场景优先采用双管反激,其确定的电压应力可显著提升可靠性,避免单管反激的参数玄学问题。关键设计要点包括快恢复二极管选型、紧凑布局及漏感

Jack010169的博客 79

06.Day 6:连接数据之源 —— Splunk SDK for Python 实战

验证Splunk 中的Python语句执行功能,包括调取插件参数,以及用SPL语句执行查询,都是我们在后期需要的核心功能。

TheWindRider的博客 541

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

c++builder 删除整个目录_Day18.python文件/目录

OS模块os模块提供了多数操作系统的功能接口函数。当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在python编程时,经常和文件、目录打交道,这时就离不了os模块,本节内容将对os模块提供的函数进行详细的解读模块导入import os文件操作文件重命名语法格式:os.rename(原文件名,新文件名)print(os.getcwd()) #先打印一下...

weixin_35626077的博客 152

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【SpringBoot】Day11-06 阿里云 文件上传

accessKeySecret:阿里云账号AccessKey对应的秘钥。objectName:对象名称,在Bucket中存储的对象的名称。引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)accessKeyId:阿里云账号AccessKey。修改UploadController 层代码。bucketName:Bucket名称。在pom.xml中导入这两项。filePath:文件路径。可以通过下面链接,配置环境。

yun_shui_的博客 516

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

苍穹外卖day06——微信登录功能+商品浏览功能代码导入springboot项目

微信小程序用户登录+商品浏览功能到吗导入。

测试 8345

CGB2105第二阶段-day06前端网页技术HTML

一、前端技术 1.概念 前端位于整个项目首要要开发的内容,直接和用户打交道,实现页面的展现和交互功能,所以在分类上俗称为前端。 但从整体来看(前端占软件开发总量的百分之十左右,地位可见一斑);从技术的含金量来看(如:业务功能是核心,远超UI的作用;分布式缓存redis的作用远超vue前端),从职业的发展路径来看(通向架构师之路,大都由后端工程师晋升的,前端几乎没有);从薪资的天花板来看(随着年头的拉长,后端工程师的薪资是前端的几倍),后端优势远大于前端。所以对于大家而言,千万不要把重心放在前端技术

weixin_58580280的博客 497

植物养护助手应用HarmonyOS ArkTS API 24运用了 ArkTS 的状态管理、自定义 Builder、枚举类型、Record 映射类型等核心特性

健身管理类应用与之前分析的外卖、招聘等应用有本质差异——它的核心数据不是"交易"或"任务",而是"时间序列的身体状态数据":每次训练有时长、卡路里、组数、重量;每次饮食有热量、蛋白质、碳水、脂肪;每周有运动时长趋势图。这些数据的共同特征是"随时间积累,用户需要横向对比和趋势分析"。这导致健身App的数据层设计必须从第一天就考虑"历史数据查询"和"多维度聚合"的需求,而非仅关注当前单条记录的增删改查。健身应用的用户行为模式也有独特之处:用户使用健身App的目标是"坚持",而不是"一次性完成任务"。这意味着激励

2301_79651252的博客 78

大数据第一季--java基础(day15)-徐培成-专题视频课程

大数据第一季--java基础(day15)

xupeicheng_2008的博客 156

施耐德 U.motion Builder软件被爆20多个0Day漏洞

12日,Zero Day网站(ZDI)一口气公布了施耐德20多个0Day,公开的原因是,从漏洞提交给厂商,到发布信息时止,已经超过了ZDI跟厂商约定的120天时间。0Day大多是涉及到 U.motion Builder。内容太多了,大家慢慢看吧。U.motion Builder据说跟楼宇能效管理系统相关。 ZDI-17-392 CVE: Publ...

weixin_33725515的博客 168
上一篇: 创建型——原型模式(Prototype)day05
下一篇: 排序算法(Sort Algorithm)day02
哆唻咪à
博客等级 码龄9年 0粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值