[23种设计模式][创建型]13.建造者模式

72 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

1.意图:

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

2.适用性:

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时

3.建造者(Builder)模式的构成:

  1. 抽象建造者(Builder):为创建一个Product对象的各个部件指定抽象接口
  2. 具体建造者(ConcreteBuilder):实现Builder接口,构造和装配产品的各个部件。定义并明确它所创建的表示,提供一个返回这个产品的接口。
  3. 指挥者(Director):构建一个使用Builder接口的对象。
  4. 产品角色(Product):被构建的复杂对象,具体建造者创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

4.构建者模式UML类图:

Image.png

5.构建者模式UML时序图:

Image.png

6.代码示例:

Image.png

产品角色:

public class Product {

    List<String> list = new ArrayList<>();

    public void add(String content) {
        list.add(content);
    }

    public void show() {
        System.out.println("Display Product: ");

        for (String content : list) {
            System.out.println(content);
        }
    }
}

抽象构建者:

public abstract class Builder {

    public abstract void buildPartA();

    public abstract void buildPartB();

    public abstract Product getResult();
}

具体构建者:

public class ConcreteBuilderA extends Builder {

    private Product product = new Product();

    @Override
    public void buildPartA() {
        product.add("part A");
    }

    @Override
    public void buildPartB() {
        product.add("part B");
    }

    @Override
    public Product getResult() {
        return product;
    }
}

具体构建者:

public class ConcreteBuilderB extends Builder {

    private Product product = new Product();

    @Override
    public void buildPartA() {
        product.add("part X");
    }

    @Override
    public void buildPartB() {
        product.add("part Y");
    }

    @Override
    public Product getResult() {
        return product;
    }
}

指挥者角色:

public class Director {

    public void build(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
    }
}

客户角色:

public class Client {

    public static void main(String[] args) {
        Director director = new Director();

        Builder builderA = new ConcreteBuilderA();
        Builder builderB = new ConcreteBuilderB();

        director.build(builderA);

        Product productA = builderA.getResult();
        productA.show();

        System.out.println("---------------");

        director.build(builderB);

        Product productB = builderB.getResult();
        productB.show();
    }
}