23种设计模式(3) - 创建者模式

1、定义

将一个复杂对象的创建和他的表示分离,使用同样的创建过程可以创建不同的表示(类的不同属性的实例)。

2、UML 图

8fHV6x.png

3、组成

  • 产品类(Product):一般是比较复杂的类,即创建该类实例的过程比较复杂
  • 抽象创建者类(IProductBuilder):创建者的抽象接口类,定义了创建对象的步骤,不同的产品创建类可以实现该接口,设计自己的实现
  • 创建者(ProductABuilder、ProductBBuilder):负责创建具体的对象实例,封装了创建类的过程。一般有两步分组成,分别是 创建产品的步骤,和返回创建好的对象
  • 导演类(Director):负责调用适当的创建者来创建产品,一般直接和创建者交互,不会直接和产品类交互

4、代码

// 复杂的对象,产品类
public class Product {
    private List<String> parts = new ArrayList<>();

  	// 需要添加多个组件才能创建产品
    public void addPart(String part) {
        this.parts.add(part);
    }

    public void show() {
        System.out.println("本产品所有组件有:" + parts.toString());
    }
}

// 抽象创建者
public interface IProductBuilder {
  	// 创建步骤
    void buildPart1();
    void buildPart2();
		// 获得创建好的产品
    Product getProduct();
}

// A产品的创建者
public class ProductABuilder implements IProductBuilder {
    private Product product = new Product();

    // 创建A产品的步骤1
    @Override
    public void buildPart1() {
        product.addPart("产品A-部件1");
    }

    // 创建A产品的步骤2
    @Override
    public void buildPart2() {
        product.addPart("产品A-部件2");
    }

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

// B产品的创建者
public class ProductBBuilder implements IProductBuilder {

    private Product product = new Product();

    // 创建产品B的步骤1
    @Override
    public void buildPart1() {
        product.addPart("产品B-部件1");
    }

    // 创建产品B的步骤2
    @Override
    public void buildPart2() {
        product.addPart("产品B-部件2");
    }

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

// 导演类,负责调用创建者生成对象
public class Director {
    public Product getProduct(IProductBuilder builder){
        builder.buildPart1();
        builder.buildPart2();
        return builder.getProduct();
    }
}

// 调用者
public class Main {
    public static void main(String[] args) {
        Director director = new Director();
        Product productA = director.getProduct(new ProductABuilder());
        Product productB = director.getProduct(new ProductBBuilder());

        productA.show();
        productB.show();
    }
}

运行结果:

本产品所有组件有:[产品A-部件1, 产品A-部件2]
本产品所有组件有:[产品B-部件1, 产品B-部件2]

5、优点

  • 封装性好。将复杂对象的创建过程封装,调用者不需要关心创建的过程
  • 拓展性好。如果有新的产品,只需要增加一个产品创建者,而不用修改已有的代码

6、和工厂模式的区别

可以发现,创建者模式和工厂模式很相似,都是用来创建对象实例,区别是 创建者模式多了个 导演类

与工厂模式相比,创建者模式主要用来创建 比较复杂的对象。因为创建的对象比较复杂,所以需要独立出一个单独的类,即 导演类,来负责这个创建的流程;而工厂类则直接创建对象。

7、适用场景

主要用于创建一些比较复杂的对象,这些对象的内部构建顺序通常比较稳定,但是对象构造的 参数/属性 会有区别。所以,如果一个对象的创建比较复杂,使用工厂模式;如果一个对象的创建特别负责,使用创建者模式。

posted @ 2020-03-23 00:36  MoonGeek  阅读(401)  评论(0编辑  收藏  举报