设计模式之创建型模式(四)建造者模式

79 阅读3分钟

有哪些创建型模式

1.单例模式 2.工厂模式 3.原型模式 4.建造者模式

接下来针对以上4种设计模式进行单独讲解

4 建造者模式

4.1 定义

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

建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分的复杂对象的创建过程分离。客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需的建造者类型即可。建造者模式关注如何一步一步地创建一个复杂对象,不同的具体建造者定义了不同的创建过程,且具体建造者相互独立

4.2 应用场景

对象的创建比较复杂,创建对象过程中有多个具体的步骤,spring中的BeanDefinitionBuilder便是建造者模式的应用

4.3 UML图

image.png 从上面UML图中可以看出

Builder作为抽象建造者定义了该复杂对象的建造过程,一般有两种类型的函数,一是buildPartX表示该复杂对象的建造过程,一是getResult表示获取的最终对象

ConcreteBuilder作为具体的建造者负责实现具体的builder逻辑

Product表示要具体建造的复杂对象

Director负责安排Product对象的具体建造流程,Director持有抽象Builder,并且在construct中明确该对象的建造流程,客户端只需要和Director类进行交互即可完成对象的构建

4.4 具体代码实现

public class Product {  
    private String partA;  
    private String partB;  
    private String partC;  
  
    public Product(String partA, String partB, String partC) {  
        this.partA = partA;  
        this.partB = partB;  
        this.partC = partC;  
    }  
  
    public void displayProduct() {  
        System.out.println("Part A: " + partA);  
        System.out.println("Part B: " + partB);  
        System.out.println("Part C: " + partC);  
    }  
}  
  
// Builder抽象建造者定义了Product对象的构建过程  
public interface Builder {  
    void setPartA();  
    void setPartB();  
    void setPartC();  
    Product getResult();  
}  
  
// ConcreteBuilder是具体的建造者,实现了Builder接口的抽象方法  
public class ConcreteBuilder implements Builder {  
    private Product product;  
  
    public ConcreteBuilder() {  
        this.product = new Product("Part A", "Part B", "Part C");  
    }  
  
    @Override  
    public void setPartA() {  
        // 在具体实现中设置PartA的逻辑  
        product.partA = "Concrete Part A";  
    }  
  
    @Override  
    public void setPartB() {  
        // 在具体实现中设置PartB的逻辑  
        product.partB = "Concrete Part B";  
    }  
  
    @Override  
    public void setPartC() {  
        // 在具体实现中设置PartC的逻辑  
        product.partC = "Concrete Part C";  
    }  
  
    @Override  
    public Product getResult() {  
        return product;  
    }  
}  
  
// Director类负责安排Product对象的构建流程, Director持有抽象Builder, 并且在construct中明确该对象的建造流程  
public class Director {  
    private Builder builder;  
  
    public Director(Builder builder) {  
        this.builder = builder;  
    }  
  
    public void construct() {  
        builder.setPartA();  
        builder.setPartB();  
        builder.setPartC();  
    }  
}  
  
// 客户端只需要和Director类进行交互即可完成对象的构建  
public class Client {  
    public static void main(String[] args) {  
        Director director = new Director(new ConcreteBuilder());  
        director.construct();  
        Product product = director.getBuilder().getResult();  
        product.displayProduct();  
    }  
}

4.5 扩展

通常可以省略掉Director类,将construct方法直接写在Builder类中,此时代码可以简化

public class Builder {  
    private Product product;  
  
    public Builder() {  
        this.product = new Product("Part A", "Part B", "Part C");  
    }  
  
    public void setPartA() {  
        // 在具体实现中设置 Part A 的逻辑  
        product.setPartA("Concrete Part A");  
    }  
  
    public void setPartB() {  
        // 在具体实现中设置 Part B 的逻辑  
        product.setPartB("Concrete Part B");  
    }  
  
    public void setPartC() {  
        // 在具体实现中设置 Part C 的逻辑  
        product.setPartC("Concrete Part C");  
    }  
  
    public Product construct() {  
        // 在具体实现中安排构建对象的流程  
        setPartA();  
        setPartB();  
        setPartC();  
        return product;  
    }  
}  
  
public class Client {  
    public static void main(String[] args) {  
        Builder builder = new Builder();  
        Product product = builder.construct();  
        product.displayProduct();  
    }  
}

甚至也可以将construct方法放在客户端

public class Builder {  
    private Product product;  
  
    public Builder() {  
        this.product = new Product("Part A", "Part B", "Part C");  
    }  
  
    public void setPartA() {  
        // 在具体实现中设置 Part A 的逻辑  
        product.setPartA("Concrete Part A");  
    }  
  
    public void setPartB() {  
        // 在具体实现中设置 Part B 的逻辑  
        product.setPartB("Concrete Part B");  
    }  
  
    public void setPartC() {  
        // 在具体实现中设置 Part C 的逻辑  
        product.setPartC("Concrete Part C");  
    }  
  
    public Product getResult() {  
        return product;  
    }  
}  
  
public class Client {  
    public static void main(String[] args) {  
        Builder builder = new Builder();  
        builder.setPartA();  
        builder.setPartB();  
        builder.setPartC();  
        Product product = builder.getResult();  
        product.displayProduct();  
    }  
}

作者:qtlq
链接:juejin.cn/post/729081…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。