1、静态工厂和构造器共同缺点:
- 不能很好的扩展到大量可选参数
2、重叠构造器模式可以部分解决上述问题,但遇到参数 太多 会使得客户端代码难以编写、阅读
- 一长串类型相同的参数,会导致微妙的错误
- 如有两个点到顺序,编译器不报错,运行时报错,调试难度增加
3、简化构造函数,采用setter方法:
- 这种模式 JavaBean 构造过程状态不一致,调试更加困难
- 阻止了类做成 不可变类的可能<15条>
- 保证线程安全较难
4、Builder(构建器)模式:
- 保证状态一致
- 可读性好
客户端利用所有参数调用构建器,类似setter方法设置相关参数:
- 客户端可以调用无参构造方法,生成不可变对象
- Builder 是构建类的静态成员类<22条>
构建该类:
- 注意这里 new NutritionFacts.Builder(240,8) 实例化的是内部静态类Builder
- NutritionFacts类在最后的build()方法内实例化的
- 所以 NutritionFacts 类是不可变类没问题
实例化外层类时,将builder的这些参数拷贝过去:
- 此时依然可以在构建类中,检验参数的合法性
- 不合法,抛出 IllegalStateException 异常
- 也可以在 setter 方法中检验,这样不用等到实例化才报错
5、Builder模式灵活性
- 可以用来创建多个对象
- builder 的参数可以在创建时调整,随对象改变
- 也可以自动填充某些域
6、设置了参数的 Builder 是一个很好的 抽象工厂
- 举例如下(有限制的通配符)构建Tree:
Class.newInstance() 破坏了编译时的异常检查
- Builder弥补了该不足
- newInstance总是企图调用类的无参构造器
7、Builder模式不足:
- 创建对象前,先创建构建器,性能有些许损耗
- Builder模式比重叠构造器更冗长,故很多很多参数时才使用
END:
- 如果类包含多个参数,构建器Builder是不错的选择
- 特别是大多数参数是可选的时候
- 构建器比重叠构造器 易于阅读
- 构建器比JavaBeans更加安全