简介

Builder Pattern:核心在于如何一步一步的构建一个包含多个组成部分的完整对象,使用相同的构建过程构建不同的产品。在软件开发中,如果需要创建复杂对象,可以考虑建造者模式。

与抽象工厂有点类似,但建造者模式返回的是一个完整的复杂产品,而抽象工厂模式只是返回同一抽象父类的各种具体子类。如果将抽象工厂模式看成一个汽车配件生产厂,生成不同类型的汽车配件。那么建造者模式就是一个汽车组装厂,通过对配件进行组装返回一个完整的汽车。


UML示例

建造者模式

代码示例

产品角色

// 产品类
public class Product {
    private String partA;
    private String partB;
    private String partC;

    public String getPartC() {
        return partC;
    }

    public void setPartC(String partC) {
        this.partC = partC;
    }

    public String getPartB() {
        return partB;
    }

    public void setPartB(String partB) {
        this.partB = partB;
    }

    public String getPartA() {
        return partA;
    }

    public void setPartA(String partA) {
        this.partA = partA;
    }
}

抽象建造者

// 抽象建造者
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("建造A部分");
    }

    public void buildPartB() {
        product.setPartB("建造B部分");
    }

    public void buildPartC() {
        product.setPartC("建造C部分");
    }
}

导演者(指挥者)

//导演类
public class Director {
    private Builder builder;
    public Director(Builder builder){
        this.builder = builder;
    }

    public void setBuilder(Builder builder){
        this.builder = builder;
    }

    public Product construct(){
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();

        return  builder.getResult();
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();

        Director director = new Director(builder);

        Product product = director.construct();

        System.out.println(product.getPartA());
        System.out.println(product.getPartB());
        System.out.println(product.getPartC());
    }
}
最后修改:2020 年 05 月 21 日
如果觉得我的文章对你有用,请随意赞赏