Item 2:当构造参数太多时考虑使用builder模式
可伸缩构造模式
telescoping constructor pattern
这种模式中,包含了多个构造方法,这些构造方法是可选参数的组合。
可伸缩构造模式缺点
- 难以调用
- 难以阅读
JavaBeans 模式
无参构造 + setter
方法。
JavaBeans 模式缺点
构造方法在多次调用中被分割,所以在构造过程中JavaBean可能处于不一致的状态。
该类没有通过检查构造参数的有效性来执行一致性的选项。在不一致的状态下尝试使用对象可能会导致与包含bug的代码大相径庭的错误,因此很难调试。
变体
当它的构造完成时,手动“冻结”对象,并且不允许它在解冻之前使用,可以减少这些缺点,但是这种变体在实践中很难使用并且很少使用。 而且,在运行时会导致错误,因为编译器无法确保程序员在使用对象之前调用freeze
方法。
Builder 模式
结合了可伸缩构造模式的安全性和javabean模式的可读性。
客户端不直接调用所需的对象,而是调用构造方法(或静态工厂),并使用所有必需的参数,并获得一个builder对象。然后,客户端调用builder对象的setter
相似方法来设置每个可选参数。最后,客户端调用一个无参的build
方法来生成对象,该对象通常是不可变的。Builder通常是它所构建的类的一个静态成员类。
1 | // Builder Pattern |
使用:
1 | NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8) |
缺点
- 创建builder对象有成本。
- 相比于可伸缩构造更冗余。
使用场景
在有大量可选参数或相同类型参数时使用。