Builder(建造者模式)
描述
指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
场景
建造者模式唯一区别于工厂模式的是针对复杂对象的创建。也就是说,如果创建简单对象,通常都是使用工厂模式进行创建,而如果创建复杂对象,就可以考虑使用建造者模式。
当需要创建的产品具备复杂创建过程时,可以抽取出共性创建过程,然后交由具体实现类自定义创建流程,使得同样的创建行为可以生产出不同的产品,分离了创建与表示,使创建产品的灵活性大大增加。
写法
一个包含多个部分的抽象产品
class Product {
private String partA;
private String partB;
private String partC;
public void setPartA(String partA) {
this.partA = partA;
}
public void setPartB(String partB) {
this.partB = partB;
}
public void setPartC(String partC) {
this.partC = partC;
}
public void show() {
//显示产品的特性
}
}
一个抽象的产品建造者,拥有抽象的产品部件建造方法。(这些访问未必都需要调用,调用顺序也也未必一样)
abstract class Builder {
//创建产品对象
protected Product product = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
//返回产品对象
public Product getResult() {
return product;
}
}
建造者,建造方法的具体实现者
一般写法
public class ConcreteBuilder extends Builder {
public void buildPartA() {
product.setPartA("建造 PartA");
}
public void buildPartB() {
product.setPartB("建造 PartB");
}
public void buildPartC() {
product.setPartC("建造 PartC");
}
}
链式调用
public class ConcreteBuilder extends Builder {
public void buildPartA() {
product.setPartA("建造 PartA");
return product;
}
public void buildPartB() {
product.setPartB("建造 PartB");
return product;
}
public void buildPartC() {
product.setPartC("建造 PartC");
return product;
}
}
指挥者,调用建造者中的建造方法完成建造。(不是必须的,可以由调用者指挥建造。)
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
//产品构建与组装方法
public Product construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
其他
Lombok
@Accessors 链式注解
@Data
@Accessors(chain = true)
public class Example {
private String name;
private String phone;
private int age;
}
@Builder 建造者注解
@Builder
public class BuilderExample {
@Builder.Default private long created = System.currentTimeMillis();
private String name;
private int age;
@Singular private Set<String> occupations;
}