建造者模式是将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示,属于创建型模式。使用建造者模式对于用户而言只需要指定需要建造的类型就可以获得对象,建造过程及细节不需要了解。
建造者模式适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。如果有一个对象有非常复杂的内部结构(很多属性),可以将复杂对象的创建和使用进行分离。首先来看下建造者模式的类图。

建造者模式中主要分为四个角色:
建造者模式适用于一个具有较多的零件的复杂产品的创建过程,由于需求的变化,组成这个复杂产品的各个零件经常变化,但是组合方式相对稳定。
适用于以下几个场景。
我们这里以人为例,一个人会拥有自己的姓名,年龄,家庭住址等信息,但是这些信息是可以随意调整的,我们可以使用这个案例稍微了解下建造者模式。
首先我们创建一个people类:
@Data
public class People {
private String name;
private String address;
private Integer age;
}
然后创建建造者类PeopleBuilder,将复杂的构造过程封装起来,构造步骤由用户决定:
public class PeopleBuilder {
private People people = new People();
public People build() {
return people;
}
public void setName(String name) {
people.setName(name);
}
public void setAddress(String address) {
people.setAddress(address);
}
public void setAge(Integer age) {
people.setAge(age);
}
}
编写测试类:
public class Main {
public static void main(String[] args) {
PeopleBuilder builder = new PeopleBuilder();
builder.setName("cc");
builder.setAge(20);
builder.setAddress("苏州");
System.out.println(builder.build());
}
}
这样就是一个最简单的建造者模式的实现,用户可以随意组装属性。
上面的基本写法是不是感觉不太优雅,用过QueryWrapper的应该都喜欢那种追加的方式。所以,一般情况下,建造者模式通常都是采用链式编程的方式来构造对象。接下来我们修改下刚刚的代码:
public class PeopleBuilder {
private People people = new People();
public People build() {
return people;
}
public PeopleBuilder setName(String name) {
people.setName(name);
return this;
}
public PeopleBuilder setAddress(String address) {
people.setAddress(address);
return this;
}
public PeopleBuilder setAge(Integer age) {
people.setAge(age);
return this;
}
}
public class Main {
public static void main(String[] args) {
PeopleBuilder builder = new PeopleBuilder()
.setName("cc")
.setAddress("南京")
.setAge(21);
System.out.println(builder.build());
}
}
修改之后是不是就感觉优雅多了,我们只需要在设置属性的时候将自身返回即可,这样就可以不断的追加了。
首先我们来看JDK中的StringBuilder,这个大家应该都很熟悉,我们可以通过不断的追加append来添加数据,最后调用一个toString获取一个构造好的字符串。
StringBuilder builder = new StringBuilder();
builder.append("11")
.append(22)
.append("333")
.toString();
当然,在spring中这种也很多,比如BeanDefinitionBuilder通过调用getBeanDefinition获取一个对象:

同时其他的也还有很多,比如QueryWrapper等。
优点
缺点