建造者模式实用于对象属性太多的状况
有一个属性十分多的类:Person
public class Person {
private String a;
private String b;
private String c;
private String d;
private String e;
private String f;
private String g;
private String h;
private String i;
private String j;
// get/set 办法
// 构造方法 1
// 构造方法 2
// 构造方法 3
// 构造方法 4
// 构造方法 5
// 构造方法 6
}
Person
类的属性十分多,咱们在创立不同属性的 Person
的时候,须要写很多的构造方法来应答不同的场景,这样代码十分臃肿,解决办法有两个,一个是采纳 BeanSet 形式,一个就是应用 Build 模式。
BeanSet 形式
public class Person {
private String a;
private String b;
private String c;
private String d;
private String e;
private String f;
private String g;
private String h;
private String i;
private String j;
public void setA(String a) {this.a = a;}
// ......
}
这种 BeanSet 形式是罕用的形式,当初插件行业很发达,赫赫有名的 Lombok
主动为咱们生成了 get 和 set 办法,这样省去了咱们写 get 和 set 办法的工夫,代码显得很洁净,然而,在咱们创建对象的时候,不得不这样:
public static void main(String[] args) {Person person = new Person();
person.setA("");
person.setB("");
person.setC("");
person.setD("");
person.setE("");
person.setF("");
person.setG("");
person.setH("");
person.setI("");
person.setJ("");
}
这样写没故障,但总感觉差那么一点啊。
Builder 模式
规范写法
- 形象建造者,个别是一个接口,蕴含创立产品对象的办法
- 导演者,调用具体建造者,创立产品对象
- 具体建造者
- 生成产品对象
这种写法长处繁琐,日常工作中根本很少用到。
个别写法
个别写法省去了
形象建造者
和导演者
,采纳动态外部类的形式来创立建造者
。
public class User {
private String name;
private Integer age;
private String gender;
private String mobile;
private String idCard;
private String address;
private User(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.gender = builder.gender;
this.mobile = builder.mobile;
this.idCard = builder.idCard;
this.address = builder.address;
}
public static class Builder {
/**require**/
private final String name;
private final Integer age;
/**optional**/
private String gender;
private String mobile;
private String idCard;
private String address;
public Builder(String name, Integer age) {
this.name = name;
this.age = age;
}
public Builder gender(String gender) {
this.gender = gender;
return this;
}
public Builder mobile(String mobile) {
this.mobile = mobile;
return this;
}
public Builder idCard(String idCard) {
this.idCard = idCard;
return this;
}
public Builder address(String address) {
this.address = address;
return this;
}
public User build() {return new User(this);
}
}
}
应用形式
public static void main(String[] args) {User use = new Builder("zhangsan", 12).address("beijing").build();}