使用场景
- 对象的构建有很多必填参数,如果使用构造函数会导致参数列表过长难以使用
- 构造参数之间有依赖关系,比如设置了 minAge 就必须设置 maxAge,且 minAge 小于等于 maxAge
- 类的属性一旦被创建就不可变(不暴力 set()方法)
类图
Person 类包含了一个内部类 Builder,负责对外暴露设置属性的方法,这些方法可以包含校验和初始化规则,属性之前的依赖规则可以放到最终调用的 build()方法中校验
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| public class Person {
private Long id; private String name; private Integer minAge; private Integer maxAge;
private Person() { }
public static class Builder {
private Person person = new Person();
public Builder id(Long id) { person.id = id; return this; }
public Builder name(String name) { person.name = name; return this; }
public Builder minAge(Integer minAge) { person.minAge = minAge; return this; }
public Builder maxAge(Integer maxAge) { person.maxAge = maxAge; return this; }
public Person build() { if (person.minAge != null && person.maxAge != null) { if (person.minAge < 0) { throw new IllegalArgumentException("minAge必须大于等于0"); } if (person.maxAge <= person.minAge) { throw new IllegalArgumentException("maxAge必须大于等于minAge"); } } else if ((person.minAge == null && person.maxAge != null) || (person.minAge != null && person.maxAge == null)) { throw new IllegalArgumentException("minAge和maxAge必须同时设置"); } return person; }
}
}
|
与工厂模式有何区别?
- 工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。
- 建造者模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。