将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,使用多个简单的对象一步一步构建成一个复杂的对象,建造代码与表示代码分离
产品类:
@ToString
class Product {
List<String> parts = new ArrayList<>();
public void addPart(String part) {
parts.add(part);
}
}
抽象建造者:
abstract class AbstractBuilder {
protected abstract void buildPartA();
protected abstract void buildPartB();
protected abstract Product getResult();
}
具体建造者实现:
/**
* 具体建造者1
*/
class ConcreteBuilder1 extends AbstractBuilder {
private Product product = new Product();
@Override
protected void buildPartA() {
product.addPart("部件A");
}
@Override
protected void buildPartB() {
product.addPart("部件B");
}
@Override
protected Product getResult() {
return product;
}
}
/**
* 具体建造者2
*/
class ConcreteBuilder2 extends AbstractBuilder {
private Product product = new Product();
@Override
protected void buildPartA() {
product.addPart("部件X");
}
@Override
protected void buildPartB() {
product.addPart("部件Y");
}
@Override
protected Product getResult() {
return product;
}
}
指挥者类:
/**
* 指挥者类
*/
class Director{
public void construct(AbstractBuilder abstractBuilder){
abstractBuilder.buildPartA();
abstractBuilder.buildPartB();
}
}
客户端调用:
Director director = new Director();
AbstractBuilder builder1 = new ConcreteBuilder1();
director.construct(builder1);
Product product1 = builder1.getResult();
log.info(product1);
AbstractBuilder builder2 = new ConcreteBuilder2();
director.construct(builder2);
builder2.getResult();
Product product2 = builder2.getResult();
log.info(product2);
结果:
17:17:03.906 [main] INFO com.learn.putc.designpatterns.create.builder.BuilderPattern - Product(parts=[部件A, 部件B])
17:17:03.913 [main] INFO com.learn.putc.designpatterns.create.builder.BuilderPattern - Product(parts=[部件X, 部件Y])