一、定义
建造者模式将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
二、框架运用
HttpClient框架在构建Client时就用到了建造者模式
三、实战
1、产品类
public class Product {
private List<String> parts = new ArrayList<>();
public void addPart(String part) {
parts.add(part);
}
public void show() {
System.out.println("产品创建-------");
parts.forEach(p -> System.out.println("---------" + p));
}
}
2、建造类
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product getResult();
}
public class ConcreteBuilder1 extends Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.addPart("部件A");
}
@Override
public void buildPartB() {
product.addPart("部件B");
}
@Override
public Product getResult() {
return product;
}
}
public class ConcreteBuilder2 extends Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.addPart("部件X");
}
@Override
public void buildPartB() {
product.addPart("部件Y");
}
@Override
public Product getResult() {
return product;
}
}
3、指挥类
public class Director {
public void construct(Builder builder){
builder.buildPartA();
builder.buildPartB();
}
}
4、执行和结果
public class Client {
public static void main(String[] args) {
Builder builderA = new ConcreteBuilder1();
Builder builderB = new ConcreteBuilder2();
Director director = new Director();
director.construct(builderA);
Product productA = builderA.getResult();
productA.show();
director.construct(builderB);
Product productB = builderB.getResult();
productB.show();
}
}
Connected to the target VM, address: '127.0.0.1:56304', transport: 'socket'
产品创建-------
---------部件A
---------部件B
产品创建-------
---------部件X
---------部件Y
Disconnected from the target VM, address: '127.0.0.1:56304', transport: 'socket'