建造者模式
给定一个模板,通过配置不同的属性,产生不同的对象
常用建造对象的两种方式比较
如果用重载构造方法的办法产生对象,那么如果类属性过多,
①需要写很多重载构造方法
②由于属性过多可能不知道对应位置的是哪个属性
③需要对你不需要的一些属性赋予默认值
如果用空构造方法产生对象,然后用set()给属性赋值,
①重复调用set(),可能导致c端拿到不完整的对象
②在多线程的情况下,无法保证属性的一致性
③成员变量不可以是 final 类型,失去了不可变对象的很多好处
通过建造者模式可以避免上面这些问题,下面是Builder的一个模板类
public class User {
private final String name;
private final int sex;
private int age;
private String phone;
private String address;
private User(Builder builder) {
name = builder.name;
sex = builder.sex;
age = builder.age;
phone = builder.phone;
address = builder.address;
}
public String getName() {
return name;
}
public int getSex() {
return sex;
}
public int getAge() {
return age;
}
public String getPhone() {
return phone;
}
public String getAddress() {
return address;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", sex=" + sex +
", age=" + age +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
'}';
}
private static class Builder {
private final String name;
private final int sex;
private int age;
private String phone;
private String address;
public Builder(String name , int sex) {
this.name = name;
this.sex = sex;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder phone(String phone) {
this.phone = phone;
return this;
}
public Builder address(String address) {
this.address = address;
return this;
}
public User build() {
return new User(this);
}
}
}
调用方式:
User user = new User.Builder("Alex", 1).age(28).phone("13264497440").address("China").build();