直接创建对象的缺点
冗长的构造器参数
当一个类的成员变量很多,在new
这个对象的时候传入参数,将导致参数列表变得冗长。
无法满足依赖
比如,如果用户设置了某个成员变量,就必须显式地设置另外相互依赖的成员变量;
或者成员变量之间有一定的约束条件。如果我们继续使用现在的设计思路,那校验逻辑就无处安放了。
不可变对象不能暴露set方法
如果我们希望对象是不可变对象,也就是说,对象在创建好之后,就不能再修改内部的属性值。要实现这个功能,我们就不能在类中暴露 set()
方法。
对象可能存在无效状态
先new
对象,后 set
成员变量,会导致部分必须的值在没有 set
之前,对象处于无效的状态。
使用建造者模式
在Builder类中做校验
把校验逻辑放置到 Builder
类中,先创建建造者,并且通过 set()
方法设置建造者的变量值,
然后在使用 build()
方法真正创建对象之前,做集中的校验,校验通过之后才会创建对象。
私有化构造函数实现不可变对象
- 将
Builder
类设计成业务类的内部类; - 把业务类的构造函数改为
private
私有权限; - 业务类不提供任何
set()
方法;
这样我们就只能通过建造者来创建,并且创建出来的对象就是不可变对象了。
与工厂模式的区别
工厂模式
是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。建造者模式
是用来创建一种类型的复杂对象,通过设置不同的可选参数,定制化地创建不同的对象。