定义
建造者模式将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示,属于创建型设计模式。
场景:
- 相同方法,不同执行顺序,产生不同结果
- 多个部件或零件,都可以装配到一个对象中,但是产生结果不同
- 产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。
- 初始化一个对象特别复杂,参数多,而且很多参数都有默认值。
链式写法
@Data
public class Product {
private String field;
private String field2;
private String field3;
}
public interface IBuild {
Product build();
}
public class Build implements IBuild{
private Product product = new Product();
@Override
public Product build() {
return product;
}
public Build field(String field){
product.setField(field);
return this;
}
public Build field2(String field2){
product.setField2(field2);
return this;
}
public Build field3(String field3){
product.setField3(field3);
return this;
}
public Product builder(){
return product;
}
}
测试:
public static void main(String[] args) {
Product product = new Build().field("1").field2("2").field3("3").builder();
System.out.println(product);
}
uml:
静态内部类写法
一般来说,静态内部类这种写法你可能遇见的次数要比上一种写法多,因为这种写法产品与创建之间的联系更加紧密,结构更加紧凑,建造者模式的形式更加简洁。
@Data
public class Product {
private String field;
private String field2;
private String field3;
public static class Builder{
private Product product = new Product();
public Product build() {
return product;
}
public Builder field(String field){
product.setField(field);
return this;
}
public Builder field2(String field2){
product.setField2(field2);
return this;
}
public Builder field3(String field3){
product.setField3(field3);
return this;
}
public Product builder(){
return product;
}
}
}
测试
Product builder = new Product.Builder().field("1").field2("2").field3("3").builder();
System.out.println(builder);
JDK源码中的运用
StringBuilder就是一个很典型的例子,它提供append方法,开放构造步骤,最后调用toString方法就可以获得一个构造好的字符串。
....
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
....
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
....