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

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

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

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

4.1 实例

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

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

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

有两个具体的比萨子类

  1. 标准的纽约风格的比萨
  2. calzone
  3. Java架构师教你写代码(二) - 使用建造者替代多参数的构造器(下)
  4. Java架构师教你写代码(二) - 使用建造者替代多参数的构造器(下)

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

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

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

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

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

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

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

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 第三版英文版

上一篇:工作流引擎使用详解!工作流框架Activiti的详细配置以及安装和使用


下一篇:Python 获取CentOS7的内存使用率并写入mysql