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 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
337 4
|
1月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
238 7
|
1月前
|
Java 数据处理 API
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
234 115
|
1月前
|
安全 Java 编译器
为什么你的Java代码需要泛型?类型安全的艺术
为什么你的Java代码需要泛型?类型安全的艺术
172 98
|
1月前
|
Java 编译器 API
java最新版和java8的区别,用代码展示
java最新版和java8的区别,用代码展示
243 43
|
1月前
|
前端开发 JavaScript BI
如何开发车辆管理系统中的车务管理板块(附架构图+流程图+代码参考)
本文介绍了中小企业如何通过车务管理模块提升车辆管理效率。许多企业在管理车辆时仍依赖人工流程,导致违章处理延误、年检过期、维修费用虚高等问题频发。将这些流程数字化,可显著降低合规风险、提升维修追溯性、优化调度与资产利用率。文章详细介绍了车务管理模块的功能清单、数据模型、系统架构、API与前端设计、开发技巧与落地建议,以及实现效果与验收标准。同时提供了数据库建表SQL、后端Node.js/TypeScript代码示例与前端React表单设计参考,帮助企业快速搭建并上线系统,实现合规与成本控制的双重优化。
|
1月前
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
358 94
|
安全 Java 开发者
Effective Java - 构造器私有、枚举和单例
Singleton 是指仅仅被实例化一次的类。Singleton代表了无状态的对象像是方法或者本质上是唯一的系统组件。使类称为Singleton 会使它的客户端测试变得十分困难。因为不可能给Singleton替换模拟实现。除非实现一个充当其类型的接口
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
143 1
|
1月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
162 1

热门文章

最新文章