模式概述:
使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。
使用场景:
- 使用生成器模式可避免 “重叠构造函数 (telescopic constructor)” 的出现。
- 当你希望使用代码创建不同形式的产品 (例如石头或木头房屋) 时, 可使用生成器模式。
- 使用生成器构造组合树或其他复杂对象。
代码样例:
代码背景: 假设你要创建一个Person对象,该对象有几十上百的属性,但你的意愿创建的对象可能并不需要其中的很多属性,构造函数会传入很多null;对于构造函数的调用十分不简洁;使用生成器进行创建Persion。
/**
* 人(复杂对象)
*/
public class Person {
private String name;
private int age;
private double weight;
private double height;
private String idCard;
private String address;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", weight=" + weight +
", height=" + height +
", idCard='" + idCard + '\'' +
", address='" + address + '\'' +
'}';
}
/**
* Person生成器
*/
public static class PersonBulider{
Person p = new Person();
/**
* 基础(必要)属性赋值
*/
public PersonBulider baseInfo(String name,int age){
p.name = name;
p.age = age;
return this;
}
/**
* 体重属性赋值
*/
public PersonBulider weight(double weight){
p.weight = weight;
return this;
}
/**
* 身高属性赋值
*/
public PersonBulider height(double height){
p.height = height;
return this;
}
/**
* 身份证属性赋值
*/
public PersonBulider idCard(String idCard){
p.idCard = idCard;
return this;
}
/**
* 身份证属性赋值
*/
public PersonBulider address(String address){
p.address = address;
return this;
}
public Person bulider(){
return p;
}
}
}
public class TestBuilder {
public static void main(String[] args) {
Person person = new Person.PersonBulider()
.baseInfo("张三",19)
.height(180)
.weight(135)
.bulider();
System.out.println(person.toString());
}
}
测试结果:
补充:
生成器中还有一个”主管“的概念;比如一个品牌汽车进行生产汽车,汽车的型号是固定的几种(汽车型号是一种维度,也可以是其他维度),每种型号的汽车的零件是一致的,换句话说,就是每种型号的汽车构件是固定的(固化的);那么可以创建一个主管类,里面提供各个型号汽车的生产方法,每个型号的生产方法内部是固定当前型号汽车的汽车零件,调用builder的方法进行生产当前型号的汽车;这样的话就不需要在客户端多次给汽车builder属性了,直接调用主管的对应型号的汽车生产方法即可。上面提供的代码样例是动态的,每个对象都是自定义的;类比汽车也可以选择一个维度让Person的创建交给主管执行,比如选择相貌维度(有帅哥、美女、丑八怪等),主管中生成帅哥的代码中,身高都是185,体重都是135等。具体使用自定义还是固化(主管)需要根据业务场景实际选择。