java Builder模式构建对象

Builder 模式是一种创建对象的设计模式,它通过使用多个简单的对象一步一步构建复杂对象。这种模式可以帮助构建复杂的对象,并提供更好的代码可读性和灵活性。Builder 模式特别适用于那些构造函数参数过多或参数默认值较多的类。

下面是一个使用 Builder 模式构造对象的示例代码:

示例代码

public class Car {private final String brand;private final String model;private final int year;private final String color;private final double price;// 私有构造方法,只能通过 Builder 构造对象private Car(Builder builder) {this.brand = builder.brand;this.model = builder.model;this.year = builder.year;this.color = builder.color;this.price = builder.price;}// 静态内部类 Builderpublic static class Builder {private String brand;private String model;private int year;private String color;private double price;// Setter 方法返回 Builder 对象本身,实现链式调用public Builder brand(String brand) {this.brand = brand;return this;}public Builder model(String model) {this.model = model;return this;}public Builder year(int year) {this.year = year;return this;}public Builder color(String color) {this.color = color;return this;}public Builder price(double price) {this.price = price;return this;}// 构建对象的方法public Car build() {return new Car(this);}}@Overridepublic String toString() {return "Car{" +"brand='" + brand + '\'' +", model='" + model + '\'' +", year=" + year +", color='" + color + '\'' +", price=" + price +'}';}public static void main(String[] args) {// 使用 Builder 模式创建 Car 对象Car car = new Car.Builder().brand("Tesla").model("Model S").year(2022).color("Red").price(79999.99).build();System.out.println(car);}
}

代码解释

  1. Car 类

    • 定义了最终的不可变对象 Car,包括 brandmodelyearcolor 和 price 属性。
    • 构造方法是私有的,只能通过 Builder 来构造 Car 对象。
  2. Builder 静态内部类

    • 提供了一组链式调用的 Setter 方法,用于设置 Car 的属性。
    • 提供一个 build 方法,用于创建 Car 对象。
  3. main 方法

    • 使用 Builder 模式创建 Car 对象,展示了链式调用的优雅性和简洁性。

优点

  1. 清晰易读

    • 链式调用使得代码更加清晰易读,特别是当构造函数参数过多时。
  2. 可变性与灵活性

    • 可以根据需要灵活地设置属性,而不需要提供多个重载的构造函数。
  3. 不可变对象

    • 最终构造出的对象是不可变的(如果只提供 getter 方法),这有助于确保对象的线程安全性和稳定性。
  4. 代码维护

    • 方便地添加新的属性,而不需要修改现有的构造函数,只需在 Builder 类中添加新的 Setter 方法。

使用场景

  • 参数过多的类

    • 当类的构造函数参数过多时,使用 Builder 模式可以避免构造函数参数过长的问题。
  • 复杂对象的构建

    • 当构建复杂对象时,需要多步骤设置属性,使用 Builder 模式可以简化代码,提高可读性。
  • 不可变对象的创建

    • 创建不可变对象时,Builder 模式可以确保对象的所有字段在构建后都是不可变的。

通过这种模式,可以更清晰地组织代码,提高代码的可读性和可维护性,同时减少创建对象时可能出现的错误。

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

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

相关文章

ABAP打印WORD的解决方案

客户要求按照固定格式输出到WORD模板中,目前OLE和DOI研究了均不太适合用于这种需求。 cl_docx_document类可以将WORD转化为XML文件,利用替换字符串方法将文档内容进行填充同 时不破坏WORD现有格式。 首先需要将WORD的单元格用各种预定义的字符进行填充…

【重走编程路】设计模式概述(十二) -- 访问者模式、中介者模式、解释器模式

文章目录 前言21. 访问者模式(Visitor)定义问题解决方案应用场景优缺点 22. 中介者模式(Mediator)定义要解决的问题解决方案应用场景优缺点 23. 解释器模式(Interpreter)定义解决方案应用场景优缺点 前言 …

数据仓库事实表

数据仓库中的三种常见事实表类型:事务事实表、周期快照事实表和累积快照事实表 事务事实表: 事务事实表是记录事务级别数据的事实表。它记录了每个事务发生的具体度量指标,如销售金额、数量等。事务事实表的优势在于能够提供详细的事务级别…

四个节点即可实现的ComfyUI批量抠图工作流

原文链接:ComfyUI面部修复完全指南 (chinaz.com) 下图就是批量抠图的工作流 虽然工作流很简单,但是我们前提还是需要安装好我们的节点 首先安装我们的抠图节点 安装 BiRefNet 所需依赖:timm,如已安装无需运行 requirements.txt…

苹果电脑crossover怎么下载 苹果电脑下载crossover对电脑有影响吗 MacBook下载crossover软件

CodeWeavers 发布了 CrossOver 24 版本更新,不仅兼容更多应用和游戏,得益于 Wine 9.0 带来的 7000 多项改进,CrossOver 还可以在 64 位系统上运行Windows应用的软件,使得用户可以在Mac系统中轻松安装使用仅支持Windows系统运营环境…

java设计模式:03-04-装饰器模式

装饰器模式(Decorator Pattern) 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰器模式通过创建一个装饰类来包装原有的类,…

视觉探秘:sklearn中聚类标签的可视化之道

视觉探秘:sklearn中聚类标签的可视化之道 在数据科学领域,聚类分析是一种无监督学习方法,用于将数据集中的样本划分为若干个组或“簇”,使得同一组内的样本相似度高,而不同组之间的样本相似度低。Scikit-Learn&#x…

如何在Java、Python、PHP中使用短信推广API?

短信推广API是一种用于营销和推广目的的应用程序接口。该API允许开发者通过短信通道向目标受众发送推广信息,包括促销活动、产品介绍、特价优惠等。短信推广API通常支持群发功能、链接跟踪、定时发送等特性,以满足企业对于推广活动的灵活需求&#xff0c…

VScode如何进行调试

参考资料: VS Code入门教程2020 #24 介绍launch.json launch.json配置文件 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0&qu…

Python中的私有属性和方法

在Python编程中,封装是一种重要的面向对象特性,用于限制对类内部数据和方法的访问,确保对象的内部状态只能通过特定的方法进行修改。这种封装机制通过使用私有属性和方法来实现。本文将详细介绍Python中的私有属性和方法及其实现方式。 什么…

搜维尔科技:【研究】动作捕捉加速游戏开发行业的发展

动作捕捉加速游戏开发行业的发展 Sunjata 的故事始于 2004 年,它将席卷乌干达视频游戏行业,然后席卷全世界。但首先,Klan Of The Kings 的小团队需要工具来实现他们的愿景。 漫画家兼非洲民间传说爱好者罗纳德卡伊马 (Ronald Kayima) 在将…

idea navigate mysql生成实体类

参考:https://blog.51cto.com/u_16175427/7251120 使用idea导航MySQL生成实体类 1、在IDEA的顶部菜单中选择View -> Tool Windows -> Database 2、找到表,右键表Scripted Extensions -> Generate POJO...

定个小目标之刷LeetCode热题(45)

32. 最长有效括号 给你一个只包含 ( 和 ) 的字符串,找出最长有效(格式正确且连续)括号 子串的长度。 示例 1: 输入:s "(()" 输出:2 解释:最长有效括号子串是 "()"有事…

6. dolphinscheduler-3.0.0伪集群部署

环境说明: 主机名:cmc01为例 操作系统:centos7 安装部署软件版本部署方式centos7zookeeperzookeeper-3.4.10伪分布式hadoophadoop-3.1.3伪分布式hivehive-3.1.3-bin伪分布式clickhouse21.11.10.1-2单节点多实例dolphinscheduler3.0.0单节…

ELK kibana查询与过滤

ELK kibana查询与过滤 1、通过布尔操作符 AND 、 OR 和 NOT 来指定更多的搜索条件(注意:这AND、OR、NOT必须大写)。例如,搜索message包含服务层关键词并且日志级别为INFO的条目,您可以输入 message:“服务层” AND level:“INFO”。 2、要搜…

Qt 实战(7)元对象系统 | 7.4、属性系统:深度解析与应用

文章目录 一、属性系统:深度解析与应用1、定义属性2、属性系统的作用3、属性系统工作原理(1)Q_PROPERTY宏(2)moc 的作用(3)属性在元对象中的注册 4、获取与设置属性4.1、QObject::property()与Q…

electron定义的变量,vue调用

在 Electron 中,主进程和渲染进程之间是通过 Inter-Process Communication (IPC) 机制进行通信的。这意味着在主进程中定义的变量不能直接在 Vue(渲染进程)中访问,因为它们运行在不同的隔离环境中。 要在 Vue 中访问主进程中定义…

KU FPGA FLASH boot失败debug

原因 新板子回来后,测试flash 烧录正常,但是无法BOOT,此时SPI设置为X4模式,使用内部时钟,速度90M。烧录过程不报错,校验也正常。 FLASH理论支持最大速度108M,90M应该还好。另外板卡预留了EMCCLK外部时钟模…

Python+Flask+MySQL/Sqlite的个人博客系统(前台+后端管理)【附源码,运行简单】

PythonFlaskMySQL/Sqlite的个人博客系统(前台后端管理)【附源码,运行简单】 总览 1、《个人博客系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 管理员登录2.2 程序主页面2.3 笔记新增界面2.4 文章新增界面2.5 文章/笔记管理界面2…

分享一个 .NET EF 6 扩展 Where 的方法

前言 Entity Framework 6(EF 6)中的 Where 方法用于筛选数据库中的数据并返回符合条件的结果,但 Where 方法只能进行简单的筛选条件,例如相等、大于、小于等简单条件,如果需要处理更复杂的逻辑条件,则需要…