构造方法的缺陷
开发过程中,我们可能碰到过要创建一个对象,但他的参数非常的多。
直接使用多个参数的构造方法的话,非常的麻烦,而且缺点也很明显的:
- 非常的不直观,看代码的人,如果不去对照的话,很难搞清楚每个参数具体的含义
- 容易传错值
- 不想赋值的也不得不传入一个null
- 想要增加参数的时候非常的麻烦,只能重载一个方法,或者把所有调用的地方都多传一个null
Builder模式
使用Builder模式可以解决以上的这些问题。
- 由于设置每个参数都提供了一个方法,通过名字可以很清楚的看出来参数的含义
- 通过方法名,可以很容易看出来要传的参数
- 不想赋值的参数,不调用方法即可
- 增加参数,并不会影响已经调用的地方,直接增加参数以及对应的方法即可
而且Builder模式还采用链式的写法,让你一爽到底!
Builder的缺点
当然,Builder模式也有缺点:
- 代码非常的冗长
- 写起来非常的麻烦
不过这两个缺点也是可以接受的
- 虽然增加了代码量,是可读性却大大的增加了,可读性vs代码量,当然还是可读性重要些
- 书写麻烦的问题其实可以通过工具来解决,比如Android Studio就提供了自动生成Builder的插件,在插件中搜索InnerBuilder即可下载该插件,在需要生成Builder的类中使用alt+insert即可轻松生成。
与setter的对比
看到这里可能你会有一个疑问,就是Builder模式做的事情,好像使用setter就可以实现了。
我个人觉得,Builder模式相比setter的一个优势或者说不同点是他的不可变性。使用Builder模式创建后,你无法直接修改对象的属性,只能重新创建一个实例。所以他非常适合用于那些初始化后就不需要再进行修改的情况。而setter的优势是,可以随时的对值进行修改。两者的使用场景还是有些许的不同的。