创建型:建造者模式

目录

1、核心思想

2、实现方式

2.1 模式结构

2.2 工作流程

2.3 实现案例

2.4 变体:链式建造者(常见于多参数对象,无需指挥者)

3、优缺点分析

4、适用场景


1、核心思想

目的:将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

           建造者的制造过程不仅要分步完成,还要按照顺序进行,所以建造者的各制造步骤与逻辑都应该被抽离出来独立于数据模型。

2、实现方式

2.1 模式结构

四个核心结构:

  • Product(产品)​:复杂的产品类,构建过程相对复杂,需要其他组件组装而成。
  • Builder(抽象建造者)​:建造者接口,定义了构成产品的各个组件的构建标准,通常有多个步骤。
  • ConcreteBuilder(具体建造者)​:具体的建造者实现类,可以有多种实现,负责产品的组装但不包含整体建造逻辑。
  • Director(指挥者)​:持有建造者接口引用的指导者类,指导建造者按一定的逻辑进行建造。

2.2 工作流程

  1. 客户端创建具体建造者实例,并传递给指挥者。

  2. 指挥者按预定步骤调用建造者的方法。

  3. 具体建造者逐步构建产品的各个部件。

  4. 最终由建造者返回组装完成的产品。

2.3 实现案例

假设构建一个House对象,步骤包括打地基、建墙、装屋顶和装修。不同房屋类型(如木屋、砖房)的建造细节不同,但流程一致。

每一个房屋的结构一致,施工方(具体建造者)不同,会导致最终的房屋产品类型不同。所以如果需要扩展建造的房屋类型,只需要扩展增加具体建造者的实现(比如砖房建造者等),符合开闭原则

// 1、产品类
class House {private String foundation;private String walls;private String roof;// 省略getter/setter
}// 2、抽象建造者
interface HouseBuilder {void buildFoundation();void buildWalls();void buildRoof();House getResult();
}// 3、具体建造者:木屋
class WoodHouseBuilder implements HouseBuilder {private House house = new House();public void buildFoundation() { house.setFoundation("Wood Foundation"); }public void buildWalls() { house.setWalls("Wood Walls"); }public void buildRoof() { house.setRoof("Wood Roof"); }public House getResult() { return house; }
}// 4、指挥者
class ConstructionDirector {public House construct(HouseBuilder builder) {builder.buildFoundation();builder.buildWalls();builder.buildRoof();return builder.getResult();}
}// 5、客户端使用
public class Client {public static void main(String[] args) {HouseBuilder builder = new WoodHouseBuilder();ConstructionDirector director = new ConstructionDirector();House house = director.construct(builder);}
}

2.4 变体:链式建造者(常见于多参数对象,无需指挥者)

// 产品类
class Person {private String name;private int age;// 其他属性...// 建造者作为静态内部类public static class Builder {private String name;private int age = 0; // 默认值public Builder(String name) { this.name = name; }public Builder age(int age) { this.age = age; return this; }public Person build() { return new Person(this); }}private Person(Builder builder) {this.name = builder.name;this.age = builder.age;}
}// 客户端使用
Person person = new Person.Builder("Alice").age(30).build();

3、优缺点分析

优点:

  1. 分离构建与表示:客户端无需了解内部构造细节。

  2. 灵活扩展:通过新增建造者支持新产品类型。

  3. 精细控制:分步骤构建,便于管理复杂对象的创建过程。

缺点:

  1. 代码冗余:需编写多个建造者类,增加代码量。

  2. 适用范围有限:仅当对象构造复杂或存在多种表示时适用。

4、适用场景

  • 对象包含多个部件,且构建过程需相同步骤。

  • 构造过程需支持不同配置或表示(如生成不同格式文档)。

  • 需要创建的对象具有大量可选参数或复杂依赖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/81900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣-长度最小的子数组

1.题目描述 2.题目链接 LCR 008. 长度最小的子数组 - 力扣(LeetCode) 3.题目分析 这道题目我们使用的也是双指针。我们可以定义两个指针都指向数组第一个元素,然后使用right指针遍历原数组,计算left指针到right指针之间的所有元…

JAVA开发工具延长方案

亲测稳定的延长方案与避坑指南 真的搞不懂了,说点专业的术语竟然成了 QINQUAN。那就直接点,把这个方案带给需要的开发者。 延长工具直通车 保姆级教程 延长方案https://mp.weixin.qq.com/s/uajM2Y9Vz6TnolzcLur_bw还是让大家看看,发什么会被…

SpringAI开发SSE传输协议的MCP Server

SpringAI 访问地址:Spring AI ‌ Spring AI‌是一个面向人工智能工程的应用框架,由Spring团队推出,旨在将AI能力集成到Java应用中。Spring AI的核心是解决AI集成的根本挑战,即将企业数据和API与AI模型连接起来‌。 MCP…

JAVA动态生成类

在java的加载过程一般都是要预先定义java类,然后通过经过加载->连接->初始化三步。连接过程又可分为三步:验证->准备->解析。初始化的类是不允许修改。但是在日常的工作中有时候需要动态生成类,那第这种情况怎么办呢? 可以这么处理: 1、先定义一个空的类,仅…

深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践

深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践 引言 随着云计算和分布式系统的快速发展,微服务架构已成为现代软件开发的主流模式。Java作为企业级应用开发的核心语言,结合Spring Boot和Spring Cloud,为开发者提…

03_基础篇-NumPy(下):深度学习中的常用操作

03_基础篇-NumPy(下):深度学习中的常用操作 通过上节课的学习,我们已经对NumPy数组有了一定的了解,正所谓实践出真知,今天我们就以一个图像分类的项目为例,看看NumPy的在实际项目中都有哪些重要…

时钟识别项目报告(深度学习、计算机视觉)

深度学习方式 一、模型架构 本模型采用双任务学习框架,基于经典残差网络实现时钟图像的小时和分钟同步识别。 主干网络 使用预训练的ResNet18作为特征提取器,移除原分类层(fc层),保留全局平均池化后的512维特征向量。…

openai-whisper-asr-webservice接入dify

openai-whisper-asr-webservice提供的asr的api其实并不兼容openai的api,所以在dify中是不能直接添加到语音转文字的模型中,对比了下两个api的传参情况,其实只要改动一处,就能支持: openai兼容的asr调用中formdata中音频…

解锁MySQL性能调优:高级SQL技巧实战指南

高级SQL技巧:解锁MySQL性能调优的终极指南 开篇 当前,随着业务系统的复杂化和数据量的爆炸式增长,数据库性能调优成为了技术人员面临的核心挑战之一。尤其是在高并发、大数据量的场景下,SQL 查询的性能直接影响到整个系统的响应…

JavaScript 性能优化实战指南

JavaScript 性能优化实战指南 前言 随着前端应用复杂度提升,JavaScript 性能瓶颈日益突出。高效的性能优化不仅能提升用户体验,还能增强系统稳定性和可维护性。本文系统梳理了 JavaScript 性能优化的核心思路、常见场景和实战案例,结合代码…

服务器磁盘按阵列划分为哪几类

以下是服务器磁盘阵列(RAID)的详细分类及技术解析,基于现行行业标准与实践应用: 一、主流RAID级别分类 1. ‌RAID 0(条带化)‌ ‌技术原理‌:数据分块后并行写入多块磁盘,无…

鸿蒙 Location Kit(位置服务)

移动终端设备已经深入人们日常生活的方方面面,如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动,都离不开定位用户终端设备的位置。 Location Kit 使用多种定位技术提供服务,可以准确地确定设备在室外/室…

二叉树深搜:在算法森林中寻找路径

专栏:算法的魔法世界 个人主页:手握风云 目录 一、搜索算法 二、回溯算法 三、例题讲解 3.1. 计算布尔二叉树的值 3.2. 求根节点到叶节点数字之和 3.3. 二叉树剪枝 3.4. 验证二叉搜索树 3.5. 二叉搜索树中第 K 小的元素 3.6. 二叉树的所有路径 …

企业级AI搜索解决方案:阿里云AI搜索开放平台

随着信息技术的飞速发展,搜索引擎作为信息获取的重要工具,扮演着不可或缺的角色。阿里云 AI 搜索开放平台以其强大的技术支持和灵活的开放性,持续为用户提供高效的搜索解决方案。 一、阿里云 AI 搜索开放平台 一站式的 AI 搜索开放平台作为…

自动驾驶中的预测控制算法:用 Python 让无人车更智能

自动驾驶中的预测控制算法:用 Python 让无人车更智能 自动驾驶技术近年来取得了令人惊叹的进步,AI 与边缘计算的结合让车辆能够实时感知环境、规划路径并执行驾驶决策。其中,预测控制(Model Predictive Control,MPC) 作为一种先进的控制算法,凭借其对未来驾驶行为的优化…

量子计算机超越超级计算机——它们解决了哪些问题?

“ 南加州大学的研究人员取得了重大突破,证明量子计算机在解决某些复杂问题时甚至可以胜过最快的超级计算机。” 量子退火最终显示出扩展优势,得益于错误抑制的量子处理,它比传统超级计算机提供更快、接近最优的解决方案。 南加州大学的研究人…

Java虚拟机 -方法调用

方法调用 方法调用静态链接动态链接案例虚方法与非虚方法虚方法(Virtual Method)非虚方法(Non-Virtual Method) 方法返回地址 方法调用 我们编写Java程序的时候,我们自己写的类通常不仅仅是调用自己本类的方法。调用别…

【 开源:跨平台网络数据传输的万能工具libcurl】

在当今这个互联互通的世界中,数据在各种设备和平台之间自由流动,而 libcurl,就像一把跨平台的万能工具,为开发者提供了处理各种网络数据传输任务所需的强大功能。它不仅是一个库,更是一种通用的解决方案,可…

ElasticSearch 8.x 快速上手并了解核心概念

目录 核心概念概念总结 常见操作索引的常见操作常见的数据类型指定索引库字段类型mapping查看索引库的字段类型最高频使用的数据类型 核心概念 在新版Elasticsearch中,文档document就是一行记录(json),而这些记录存在于索引库(index)中, 索引名称必须是…

优化 CRM 架构,解锁企业竞争力密码

引言 “在所有企业面临的挑战中,客户关系管理无疑是最为关键的一环。” —— 彼得德鲁克 在数字化浪潮席卷的当下,企业面临着前所未有的机遇与挑战。客户关系管理(CRM)作为企业运营的核心环节,其架构的优劣直接影响着…