Java架构师教你写代码(二) - 使用建造者替代多参数的构造器(下)

简介: Java架构师教你写代码(二) - 使用建造者替代多参数的构造器(下)

4 建造者模式适于类层次结构

使用构建器的平行层次结构,每个构建器都嵌套在相应类中。

抽象类有抽象类构建器;具体类有具体类构建器。

4.1 实例

类继承结构中处于最底端的抽象类:各种比萨:

image.png

BasePizza.Builder 泛型类型,有个递归类型的参数。和抽象的 self 方法一起,允许在子类中适当地进行方法链接,而无需强制转换。对于 Java 缺少自类型这一事实,这种变通方法是模拟自类型习惯用法。

有两个具体的比萨子类

  1. 标准的纽约风格的比萨
  2. calzone
  3. image.png
  4. image.png

每个子类的构建器中的build方法声明为返回正确的子类:

  • NyPizza.Builder 返回 NyPizza
  • Calzone.Builder 返回 Calzone

子类方法声明为返回父类中声明的返回类型的子类型(协变返回类型)。通过构建器,无需类型转换。

image.png

与构造器比,优势是可以有多个可变参数,因为每个参数都是在自己的方法中指定的。

构建器可以将多次调用某一方法而传入的参数聚合到一个字段

image.png

5 优点

建造者模式灵活,一个构建器可被重复使用而构建多个对象。

构建器参数可以在调用build方法创建对象间调整,也可随着不同的对象而改变。

构建器可自动填充某些字段,例如在每次创建对象时自动增加序列号。

Also, the Builder pattern is more verbose than the telescoping constructor pattern, so it should be used only if there are enough parameters to make it worthwhile, say four or more. But keep in mind that you may want to add more parameters in the future. But if you start out with constructors or static factories and switch to a builder when the class evolves to the point where the number of parameters gets out of hand, the obsolete constructors or static factories will stick out like a sore thumb. Therefore, it’s often better to start with a builder in the first place.

6 缺点

  1. 为创建对象,须先创建构建器。虽然在实践中创建构建器成本可能不显著,但在性能场景,可能是问题
  2. 建造者模式比可伸缩构造器模式更冗长,只在有足够多参数时值得,≥4个时使用吧
  3. 你可能在将来添加更多参数。但是,如果以构造器或静态工厂开始,直至类扩展到参数失控时,也会切换到构建器,但是过时的构造器或静态工厂很难处理。因此,最好一开始就从构建器开始

7 总结

在设计构造器或静态工厂的类时,有许多参数是可选的或具有相同类型时,建造者模式是很好的选择。

与可伸缩构造器比,使用构建器客户端代码更容易读写,而且比 JavaBean 安全。

翻译并整理自 effective java 第三版英文版

目录
相关文章
|
1天前
|
存储 安全 Java
掌握8条泛型规则,打造优雅通用的Java代码
掌握8条泛型规则,打造优雅通用的Java代码
掌握8条泛型规则,打造优雅通用的Java代码
|
1天前
|
Java 程序员 图形学
程序员教你用代码制作飞翔的小鸟--Java小游戏,正好拿去和给女神一起玩
《飞扬的小鸟》Java实现摘要:使用IntelliJ IDEA和JDK 16开发,包含小鸟类`Bird`,处理小鸟的位置、速度和碰撞检测。代码示例展示小鸟图像的加载、绘制与旋转。同时有`Music`类用于循环播放背景音乐。游戏运行时检查小鸟是否撞到地面、柱子或星星,并实现翅膀煽动效果。简单易懂,可直接复制使用。
|
1天前
|
前端开发 Java 关系型数据库
Java医院绩效考核系统源码B/S架构+springboot三级公立医院绩效考核系统源码 医院综合绩效核算系统源码
作为医院用综合绩效核算系统,系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
14 2
|
2天前
|
数据库连接
java+ssm+vue代码视频学习讲解
java+ssm+vue代码视频学习讲解
5 0
|
2天前
|
消息中间件 Java 微服务
Java微服务架构实践指南
Java微服务架构实践指南
12 0
|
2天前
|
SQL 缓存 算法
优化你的Java代码:性能调优技巧
优化你的Java代码:性能调优技巧
8 0
|
3天前
|
Java 编译器 程序员
Java一分钟之第一行Java代码:输出"Hello, World!"
【5月更文挑战第7天】本文引导初学者编写运行第一个Java程序——打印"Hello, World!",介绍基本代码结构及常见问题。包括语法错误(如缺少分号、缩进不规范)、编译运行问题(忘记编译、运行错误)和环境配置问题(JDK未安装、环境变量未设置)。建议检查语法、熟悉编译运行流程并正确安装配置JDK。通过实战演练,从编写到运行,迈出Java编程第一步。
13 0
|
4月前
|
设计模式 消息中间件 缓存
2024年Java架构师面试宝典 图文并茂 10G面试题 请收藏
2024年Java架构师面试宝典 图文并茂 10G面试题 请收藏
270 1
|
9月前
|
架构师 网络协议 Java
严禁外传!字节跳动2023春招Java岗位架构师面试题(暂定版)发布
说来说去废话也是那么多,今天小编实在是不想写前言了“原谅我一次”让我任性一回!
136 0
|
存储 SQL 安全