建造者模式

136 阅读2分钟

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

角色

Builder(抽象建造者)

为产品对象的各个部件指定抽象接口。通常包含两类方法:(1)buildPartX(),用于创建复杂对象的各个部位(2)getResult(),用于返回复杂对象。

public abstract class Builder {
    protected Product product =new Product();

    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract void buildPartC();

    public Product gerResult(){
        return product;
    }
}

ConcreteBulider(具体建造者)

实现Builder接口

public class ConcreteBuilder extends Builder {
    @Override
    public void buildPartA() {
        System.out.println("组装A部分");
        product.setPartA("A部分");
    }

    @Override
    public void buildPartB() {
        System.out.println("组装B部分");
        product.setPartB("B部分");
    }

    @Override
    public void buildPartC() {
        System.out.println("组装C部分");
        product.setPartC("C部分");
    }
}

Product(产品)

被构建的复杂对象.

public class Product {
    private String partA;
    private String partB;
    private String partC;

    public String getPartA() {
        return partA;
    }

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

    public String getPartB() {
        return partB;
    }

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

    public String getPartC() {
        return partC;
    }

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

    @Override
    public String toString() {
        return "Product{" +
                "partA='" + partA + '\'' +
                ", partB='" + partB + '\'' +
                ", partC='" + partC + '\'' +
                '}';
    }
}

Director(指挥者)

负责安排复杂对象的建造次序。

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.buildPartC();
        builder.buildPartB();
        builder.buildPartA();
        return builder.gerResult();
    }
}

客户类

public class BuilderClient {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        Product product = director.construct();
        System.out.println(product.toString());
    }
}

测试结果:

组装C部分
组装B部分
组装A部分
Product{partA='A部分', partB='B部分', partC='C部分'}

优点

(1)将产品与创建过程解耦,使得相同的创建过程可以创建不同的产品对象。

(2)每一个具体建造者(产品的配置)相互独立。

(3)创建过程清晰可控

缺点

(1)不适用创建过程相差较大的产品之间

(2)对于内部变化复杂的产品,会增加系统的理解程度以及运行成本。

适用场景

(1)产品内部结构相对复杂

(2)产品创建过程存在先后次序

(3)需要对产品的创建和使用进行隔离