对 Builder 模式的思考

Posted by hurshi on 2019.04.25
  1. 在实例化一个很多参数的对象,或者参数有默认值的时候,用 builder 模式可以极大提高使用者的体验

  2. 避免被实例化对象部分成员变量的重复初始化

分析

上面第1条我想大家都认可,也是初次使用 builder 模式的最直观感受吧。我们着重分析下第二条:“避免被实例化对象部分成员变量的重复初始化”

  1. 如果一个对象需要很多可配置参数,一般有2种方式,一种就是实例化后再挨个赋值,还有一种就是把所有参数都一股脑的塞到构造函数中。
  2. 对于实例化后再挨个赋值,如果参数有默认值的话(初始值不为null),那么必然会出现重复赋值的问题。
  3. 对于将所有参数一股脑塞到构造函数中,对实例化这个对象来说,Builder 模式就是这么干的(就是在构造函数中初始化所有变量),但是这样真的能避免重复赋值么?真的能增强性能么?我们分3种情况来讨论:
    1. 成员变量只声明,不初始化:这样的话,在不在构造函数中初始化都无所谓,反正在你第一次赋值之前他也没有其他赋值
    2. 成员变量初始值是 null:这样和上面的情况是一样的效果
    3. 成员变量有不为 null 的初始值:无论在构造函数中初始化,还是在实例对象上赋值,在此之前成员变量已经被初始化过了。所以必然会被重复赋值。

结论

  1. Builder 模式有2点好处:
    1. 对使用者友好,以一种非常优雅的方式链式调用
    2. 被初始化的对象成员变量之间有千丝万缕的关系的时候,相比于实例化后再赋值,能在初始化之前处理这些关系。从而对使用者无感,也不用把这些无关代码塞到被实例对象的代码中去。
    3. 使用 Builder 模式可以将目标类的构造函数声明为 private 的,从而强制执行实例化前的初始化工作。
  2. 对性能没有优化,反而实例化 Builder 对象本身还消耗了一定性能。

其他

  • Android Studio 可以使用 InnerBuilder插件自动生成。