创建型——建造者(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

【中英双语】Illumina测序原理详解 | 边合成边测序/Sequencing by Synthesis

很多朋友们问我视频讲解时用的笔记可不可以分享,那当然必须是可以呐!但我当时其实没有好好记录,只是打了个草稿就开讲啦!既然大家有需求,俺就重新整理了一下,希望可以帮到大家!

weixin_43843918的博客 7870

Day06【API、String、String Builder】上课

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

weixin_43525993的博客 149

AMD 3D V-Cache技术解析:CPU缓存堆叠如何突破性能瓶颈

在半导体领域,缓存(Cache)是提升处理器性能的关键技术,其核心原理是在高速CPU核心与慢速主存之间建立数据中转站,以缓解“内存墙”问题。随着摩尔定律放缓,传统平面扩展缓存面临面积成本高、延迟增加等挑战。3D封装技术应运而生,通过垂直堆叠实现极致的互联密度与带宽,成为突破性能瓶颈的重要工程路径。这项技术的价值在于能以更优的功耗和延迟,显著提升缓存容量,从而改善游戏、科学计算等数据密集型应用的性能。以AMD 3D V-Cache为代表的Hybrid Bonding(混合键合)工艺,正是这一趋势的典型实践,它

weixin_30432579的博客 417

苍穹外卖Day06笔记

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

sheeta1998的博客 412

WIFI CSI动作识别数据集全解析:从数据采集到深度学习应用

本文全面解析了利用商用Wi-Fi设备的信道状态信息进行动作识别的完整流程。文章以经典WiSA数据集为例,深入剖析了CSI数据的采集原理、结构特点,并详细阐述了从原始数据预处理、特征工程到深度学习模型(如CNN-LSTM融合架构)构建与优化的关键技术,旨在为研究者提供从数据到应用的全链路实战指南。

r2s3t4的博客 281

Diffusion:如何从噪声中生成清晰图像

扩散模型是当前AI图像生成领域的核心基础,如Stable Diffusion、DALL·E等热门模型均采用该技术。其原理分为训练和推理两个阶段:训练时通过逐步加噪图片,让AI学习如何去除噪声;推理时则从随机噪声出发,结合文本提示逐步去噪生成清晰图像。模型架构通常包含文本编码器、生成模型(如U-Net)和解码器三部分,通过多轮迭代将低维潜在空间表示转化为最终图像。这种技术模拟了艺术家从混沌中雕琢作品的过程,实现了从随机噪声到目标图像的智能生成。

laumy的学习笔记 1274

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

从静态到动态:如何用Deformable 3DGS和4DGS实现高效动态场景建模

本文深入探讨了Deformable 3DGS和4DGS在动态场景建模中的技术突破,详细解析了这两种方法如何高效处理动态内容。Deformable 3DGS通过引入时间维度的变形场扩展传统3DGS,而4DGS则采用四维时空体素分解方法,两者均显著提升了动态场景建模的效率和质量,适用于虚拟现实、增强现实等应用场景。

weixin_29063035的博客 433

day06:缓存商品、购物车

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

m0_69266818的博客 946

【Unity大规模RTS/攻城战框架】Large Scale Combat System - RTS Sieges深度解析

本文介绍了Unity专业级大规模RTS战斗框架Large Scale Combat System(LSCS)。该系统通过Job System+Burst技术解决了万人级单位的性能问题,提供完整的RTS操作体系、动态阵型系统、战术AI和攻城战功能。其亮点包括可破坏城门、行走城墙、战术AI配置系统,支持URP渲染管线,适用于Total War风格的大规模兵团对战项目。LSCS不仅提供核心战斗系统,还包含UI、小地图等配套模块,是Unity中少有的专业级RTS解决方案,特别适合需要深度战术玩法和大规模战斗的开发者

2403_88403568的博客 1333

2025年再论 SAP ABAP 系统经典的三层架构的理解

【摘要】本文基于作者19年SAP开发经验,深入解析SAP经典三层架构在S/4HANA时代的演进与实践。数据库层从多数据库支持转向HANA专属,通过SQLScript实现计算下推;应用层以ABAP平台为核心,融合OData和RAP等现代开发范式;表现层从SAP GUI过渡到Fiori Launchpad为主导。文章通过真实案例(如月末关账优化、ATP检查改造)展示三层协作如何提升性能,并探讨了本地/云/混合部署策略。全文贯穿SAP官方技术文档参考,为开发者提供体系化架构认知和实践指导。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 755

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

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

木兮兮 189

【行为决策模块项目实战】解耦控制--多控制器管理与切换的方法(附C++代码)

[请添加图片描述](https://img-blog.csdnimg.cn/c11300d9e4fe421e9070f474a468d1db.jpeg)本文先对多控制器管理与切换的方法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容VERTICAL_VEL, //垂直速度PID控制器VERTICAL_POS, //垂直位置PID控制器HORIZONTAL, //水平速度PID控制器YAW, //航向角yaw位置逻辑控制器。

qq_35635374的博客 1211

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

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

TheWindRider的博客 541

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

weixin_35626077的博客 152

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

yun_shui_的博客 516

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

苍穹外卖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、付费专栏及课程。

余额充值