静态工厂方法和构造函数都有一些限制:
当有很多可选参数时不够灵活。
叠进式的构造函数:
叠进式的构造函数使编写客户端代码很难,并且阅读起来更难。
冗长的类型参数也会引起微妙的bug。
JavaBeans:
JavaBean式的构造没有以上的问题,但是这种方式也有一些缺点:
JavaBean可能处于非一致的状态。JavaBean无法使其为不可变类。
为了消除这些缺点,可以在创建过程中,设置为“已冻结”的状态,然后在创建完毕之后设
置为“解冻”状态。但是这种方式不是很常用,因为其在运行时而不是编译时引发错误。
构造器模式:
可读性与安全性兼顾的构造方式:构造器模式
并不直接构造对象,而是通过调用静态构造方法,并传入必需参数来获取到一个builder对象,然后客户端调用builder对象的各种setter方法设置可选参数,最后调用builder对象的build方法,返回最终构造的目标对象。
builder通常是其所创建对象类的静态成员类
构造器模式将所有的默认值都聚合到了一起,并且其setter方法可以返回构造器本身,从而形成链式调用。
NutritionFacts cocaCola = new NutritionFacts.Builder(240,8).calories(100).sodium(35).carbohydrate(27).build();
为了检查无效参数,可将检查逻辑放置到builder的构造方法或者方法上;检查多个参数的逻辑课放置到build方法上。
builder模式还很适合类继承
builder模式也有其缺点:
1、创建对象之前,必须要先创建Builder;创建Builder在实践中也是不可忽视的成本
2、在性能关键的情况下,可能会成为问题
3、Builder模式更加冗长啰嗦,所以只在4个参数或者更多的情况下考虑使用
总之,builder模式是在构造方法或者静态工厂参数比较多的情况下的一个好选择。