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

IC版图设计之OASIS文件格式详解

OASIS(Open Artwork System Interchange Standard)是继GDSII之后新一代的集成电路版图数据交换标准,由SEMI在2004年正式发布(SEMI标准号:SEMI P39)。高压缩率:相比GDSII可减少3-10倍文件体积扩展性强:支持纳米级工艺的复杂图形描述跨平台兼容:独立于EDA工具和操作系统安全增强:内置校验和与加密支持。

ZZcppc的博客 2440

Day06【API、String、String Builder】上课

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

weixin_43525993的博客 149

Foxglove Studio实战:5步搞定自动驾驶数据可视化(附避坑指南)

本文详细介绍了如何使用Foxglove Studio高效搭建自动驾驶数据可视化工作流。通过五个核心步骤:环境准备、数据导入、面板搭建、交互分析与自动化集成,帮助开发者快速掌握这一专为机器人系统设计的开源平台。文章重点解析了其与ROS/ROS 2、MCAP等数据源的无缝对接,以及3D点云、多传感器融合、团队标注等核心功能,并附有实用的性能优化与避坑指南,旨在提升算法调试与团队协作效率。

d3e4f的博客 335

苍穹外卖Day06笔记

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

sheeta1998的博客 412

电容式触摸抗干扰设计:工业环境下的实践方案

针对工业环境中电容式touch器件易受干扰的问题,分享实用的硬件布局与软件滤波方案,提升touch响应稳定性和可靠性。

weixin_35755562的博客 843

【变化检测】变化检测相关数据集+代码+论文合集

光学影像变化检测领域数据集(有label的,无label的)、高光谱影像变化检测领域数据集、3D变化检测领域数据集、传统变化检测算法、深度学习变化检测算法、SAR变化检测算法、高光谱变化检测算法论文及代码等资源。

向上生长的程序媛的博客 2089

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

自私兽群优化器(SHO)详解:从生物本能到智能优化

自私兽群优化器(SHO)是一种受动物群体自私行为启发的智能优化算法。该算法模拟动物在捕食威胁下的两种行为:聚集行为(全局搜索)和自私行为(局部搜索),将优化问题的解空间映射为生存环境,候选解视为猎物个体。SHO通过安全性评估将猎物分为安全、危险和高危三类,分别采用不同的位置更新策略,并引入捕食者角色增加选择压力。相比传统优化算法,SHO具有无需梯度信息、自适应平衡探索与开发、参数简单等优势,特别适合高维复杂和多模态优化问题。算法通过马尔可夫链理论保证收敛性,已在工程设计和数据挖掘等领域展现出良好性能。

qq_42212808的博客 196

day06:缓存商品、购物车

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

m0_69266818的博客 946

一文读懂OpenClaw:核心组件与工作原理深度解析

Agent核心:负责理解意图、规划任务、协调执行消息系统:统一的消息格式,实现组件间解耦工具注册表:可扩展的工具系统,支持自定义工具模型适配层:多模型支持,统一API接口安全机制:沙箱隔离、权限确认、操作审计性能优化:并行执行、智能缓存、增量更新理解这些核心组件和工作原理,将帮助你更好地使用OpenClaw,也为后续开发自定义扩展打下坚实基础。在下一篇文章中,我们将详细介绍OpenClaw的界面操作,包括命令行与交互模式的各种技巧。

gaoxiang_120的专栏 833

C# HttpClient完全攻略:从入门到精通只需5步

HttpClient是.NET框架中用于发送HTTP请求和接收HTTP响应的类。它基于异步编程模型,使得网络操作更加高效和灵活。

java专栏 1579

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

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

木兮兮 189

简谈基于FPGA的千兆以太网设计

简谈基于FPGA的千兆以太网设计 今天给大侠带来简谈基于FPGA的千兆以太网设计,话不多说,上货。 今天我们来简单的聊一聊以太网,以太网在FPGA学习中属于比较高级的内容了,有些大侠肯定会感觉以太网学习起来非常不容易。其实,我可以告诉大家,前期学习的基础打扎实了,后期的学习也没那么难。总之就是说难没那么难,说容易也不是那么容易。那么,言归正传,下面让我们一起来聊一聊以太网的学习。 说起以太网,大家可能就会想到百兆以太网、千兆以太网以及万兆以太网等等。局域以太网从10M开始发展,经历几多的变迁,发展到现

3619

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

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

TheWindRider的博客 541

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

weixin_35626077的博客 152

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

yun_shui_的博客 516

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

余额充值