解决问题
以一种更加清晰简洁的方式来解决复杂结构体的构建过程,且可以让用户更加灵活地控制对象的构建过程。相对于constructor和setter方法,它的语法更加简洁和清晰。
但它所面临的一个问题是,对于每个类都要写一个Builder,这无疑增加了写代码的难度。
应用场景
应用于复杂结构体的构建。一个很好的工具是lombok的@Builder
原理图(UML)
image这个原理图是比较恶心的,采用接口化编程实理builder, 然后使用一个引导器完成对象的创建。一般情况下,不建议使用该方式(太复杂)
示例
我认为该原理图将builder模式变得很复杂,既然每个类都要写一个builder,那该builder我们可以将其认为是类的一部分,所以使用内部类会成为一个不错的方式
public class Student {
private int id;
private String name;
private String passwd;
private String sex;
private String address;
// 构造器尽量缩小范围
private Student() {
}
// 构造器尽量缩小范围
private Student(Student origin) {
// 拷贝一份
this.id = origin.id;
this.name = origin.name;
this.passwd = origin.passwd;
this.sex = origin.sex;
this.address = origin.address;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getPasswd() {
return passwd;
}
public String getSex() {
return sex;
}
public String getAddress() {
return address;
}
/**
* Student的创建完全依靠Student.Builder,使用一种方法链的方式来创建
*
*/
public static class Builder {
private Student target;
public Builder() {
target = new Student();
}
public Builder address(int id) {
target.id = id;
return this;
}
public Builder name(String name) {
target.name = name;
return this;
}
public Builder password(String passwd) {
target.passwd = passwd;
return this;
}
public Builder sex(String sex) {
target.sex = sex;
return this;
}
public Builder address(String address) {
target.address = address;
return this;
}
public Student build() {
return new Student(target);
}
}
}
Student s=new Student.Builder().name("xx").password("****").sex("男").address("北京市朝阳区").build();
image
参考
网友评论