使用多个简单的对象一步一步构建成一个复杂的对象。
为什么用?
使用构造函数 ,你首先要决定使用哪一个,然后里面又是一堆参数,如果这些参数的类型很多又都一样,你还要搞清楚这些参数的含义,很容易就传混了
Javabean get set 在构建过程中对象的状态容易发生变化,造成错误。因为那个类中的属性是分步设置的。
什么时候用?
需要生成的对象具有复杂的内部结构,一些基本部件不会变,而其组合经常变化的时候。
当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。
例如: 计算机 游戏中的角色。
怎么用?
使用场景:创建电脑
- 在Computer 中创建一个静态内部类 Builder,然后将Computer 中的参数都复制到Builder类中。
- 在Computer中创建一个private的构造函数,参数为Builder类型
- 在Builder中创建一个
public
的构造函数,参数为Computer中必填的那些参数,cpu 和ram。 - 在Builder中创建设置函数,对Computer中那些可选参数进行赋值,返回值为Builder类型的实例
- 在Builder中创建一个
build()
方法,在其中构建Computer的实例并返回
/**
* @author wuhongyun
* @date 2020/5/4 22:28
*/
public class Computer {
private String cpu;//必须
private String ram;//必须
private int usbCount;//可选
private String keyboard;//可选
private String display;//可选
//在Computer中创建一个private的构造函数,参数为Builder类型
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.ram = builder.ram;
this.usbCount = builder.usbCount;
this.keyboard = builder.keyboard;
this.display = builder.display;
}
// 在Computer 中创建一个静态内部类 Builder,然后将Computer 中的参数都复制到Builder类中。
public static class Builder {
private String cpu;//必须
private String ram;//必须
private int usbCount;//可选
private String keyboard;//可选
private String display;//可选
//在Builder中创建一个public的构造函数,参数为Computer中必填的那些参数,cpu 和ram。
public Builder(String cup, String ram) {
this.cpu = cup;
this.ram = ram;
}
//在Builder中创建设置函数,对Computer中那些可选参数进行赋值,返回值为Builder类型的实例
public Builder setUsbCount(int usbCount) {
this.usbCount = usbCount;
return this;
}
public Builder setKeyboard(String keyboard) {
this.keyboard = keyboard;
return this;
}
public Builder setDisplay(String display) {
this.display = display;
return this;
}
//在Builder中创建一个build()方法,在其中构建Computer的实例并返回
public Computer build() {
return new Computer(this);
}
}
}
封装查询条件
public class SearchParam {
private String fieldName;
private Object value;
private Operator operator;
private SearchParam() {
}
public static SearchParam of(String fieldName, Operator operator, Object value) {
return new SearchParam.Builder().fieldName(fieldName).operator(operator).value(value).build();
}
public String getFieldName() {
return fieldName;
}
public Object getValue() {
return value;
}
public Operator getOperator() {
return operator;
}
public static class Builder {
private SearchParam target;
public Builder() {
this.target = new SearchParam();
}
public Builder fieldName(String fieldName) {
target.fieldName = fieldName;
return this;
}
public Builder value(Object value) {
target.value = value;
return this;
}
public Builder operator(Operator operator) {
target.operator = operator;
return this;
}
public SearchParam build() {
return this.target;
}
}
}