概述
Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
其通用类图如下所示:

- 产品类,实际要构建出的对象
public class Product { }
- 抽象构建者
public abstract class Builder {
//设置产品的不同部分,以获得不同的产品
public abstract void setPart();
//建造产品
public abstract Product buildProduct();
}
- 具体构建者,实现抽象构建者中定义的所有方法,并返回一个构建好的对象
public class ConcreteProduct extends Builder {
private Product product = new Product();
//设置产品零件
public void setPart(){
/* * 产品类内的逻辑处理 */
}
//组建一个产品
public Product buildProduct() {
return product;
}
}
- 导演类,负责安排已有模块的顺序,然后告诉Builder开始建造。
public class Director {
private Builder builder = new ConcreteProduct();
//构建不同的产品
public Product getAProduct(){
builder.setPart();
/** 设置不同的零件,产生不同的产品 */
return builder.buildProduct();
}
}
应用场景
优雅地创建复杂对象,适用于对通过多个参数构造对象进行重构。
优缺点
优点:
- 解耦,逻辑清晰,对象的构建统一交由Builder类;
- 链式调用,使用灵活。
缺点:
- 增加Builder类的维护,每次构建需要先创建对应的 Builder 对象。
源码中的Builder模式
Builder模式的代码自动生成
在Idea中settings-->plugins搜索builder,安装结果中的第一个插件Builder Generator

现有以下Bean对象,我们要为其创建builder对象。
public class PersonDTO {
private String name;
private String sex;
private int age;
private Date birthday;
// 省略get/set方法
}
使用快捷键Alt + Insert
,在出现的菜单中选择Builder。

如果Builder类只作为内部类,不单独创建,可勾选Inner builder
。

生成后的代码如下:
public class PersonDTO {
private String name;
private String sex;
private int age;
private Date birthday;
public static final class PersonDTOBuilder {
private String name;
private String sex;
private int age;
private Date birthday;
private PersonDTOBuilder() {
}
public static PersonDTOBuilder aPersonDTO() {
return new PersonDTOBuilder();
}
public PersonDTOBuilder withName(String name) {
this.name = name;
return this;
}
public PersonDTOBuilder withSex(String sex) {
this.sex = sex;
return this;
}
public PersonDTOBuilder withAge(int age) {
this.age = age;
return this;
}
public PersonDTOBuilder withBirthday(Date birthday) {
this.birthday = birthday;
return this;
}
public PersonDTO build() {
PersonDTO personDTO = new PersonDTO();
personDTO.setName(name);
personDTO.setSex(sex);
personDTO.setAge(age);
personDTO.setBirthday(birthday);
return personDTO;
}
}
}
网友评论