遇到多构造器时,使用构建器(2)

1、静态工厂和构造器共同缺点:

  • 不能很好的扩展到大量可选参数

2、重叠构造器模式可以部分解决上述问题,但遇到参数 太多 会使得客户端代码难以编写、阅读

  • 一长串类型相同的参数,会导致微妙的错误
  • 如有两个点到顺序,编译器不报错,运行时报错,调试难度增加

3、简化构造函数,采用setter方法:

  • 这种模式 JavaBean 构造过程状态不一致,调试更加困难
  • 阻止了类做成 不可变类的可能<15条>
  • 保证线程安全较难

190001_vxr5_3847203.png

4、Builder(构建器)模式:

  • 保证状态一致
  • 可读性好

客户端利用所有参数调用构建器,类似setter方法设置相关参数:

  • 客户端可以调用无参构造方法,生成不可变对象
  • Builder 是构建类的静态成员类<22条>

190930_9vaC_3847203.png

构建该类:

  • 注意这里 new NutritionFacts.Builder(240,8) 实例化的是内部静态类Builder
  • NutritionFacts类在最后的build()方法内实例化的
  • 所以 NutritionFacts 类是不可变类没问题

192035_9NHc_3847203.png

实例化外层类时,将builder的这些参数拷贝过去:

  • 此时依然可以在构建类中,检验参数的合法性
  • 不合法,抛出 IllegalStateException 异常
  • 也可以在 setter 方法中检验,这样不用等到实例化才报错

192945_qv0P_3847203.png

5、Builder模式灵活性

  • 可以用来创建多个对象
  • builder 的参数可以在创建时调整,随对象改变
  • 也可以自动填充某些域

6、设置了参数的 Builder 是一个很好的 抽象工厂

193937_N6EN_3847203.png

  • 举例如下(有限制的通配符)构建Tree:

194107_8wic_3847203.png

Class.newInstance() 破坏了编译时的异常检查

  • Builder弥补了该不足
  • newInstance总是企图调用类的无参构造器

7、Builder模式不足:

  • 创建对象前,先创建构建器,性能有些许损耗
  • Builder模式比重叠构造器更冗长,故很多很多参数时才使用

END:

  • 如果类包含多个参数,构建器Builder是不错的选择
  • 特别是大多数参数是可选的时候
  • 构建器比重叠构造器 易于阅读
  • 构建器比JavaBeans更加安全

转载于:https://my.oschina.net/u/3847203/blog/1816904

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值