建造者模式

1、概念

建造者模式可以叫生成器模式,属于创建型模式,它是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
建造者模式
2、模式结构

  • Builder:为创建一个Product对象的各个部件指定抽象接口
  • ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口
  • Director:构造一个使用Builder接口的对象
  • Product:表示被构造的复杂对象
  • ConcreateBuilder:创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口

3、使用场景

  • 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性
  • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序
  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
  • 当构造过程必须允许被构造的对象有不同的表示时

4、优缺点

优点:

  • 建造者模式的封装性很好,将一个复杂对象的创建过程封装起来
  • 容易进行扩展,允许对象通过多个步骤来创建,并且可以改变过程
  • 向客户隐藏产品内部的实现
  • 产品的实现可以被替换,因为客户只看到了一个抽象的接口

缺点:

  • 使用范围受到一定的限制,产品需要有共同性
  • 可能导致系统变得很庞大,如果产品内部变化复杂,会导致需要定义很多具体建造者类来实现这种变化

5、实例

public class Package {
    private String name;
    private float price;
    private List<Product> list;

    public String getName() {
        return name;
    }

    public float getPrice() {
        return price;
    }

    public List<Product> getList() {
        return list;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public void setList(List<Product> list) {
        this.list = list;
    }
}
public abstract class Builder {
    public abstract void setPackage(String name, float price, List<Product> list);

    public abstract Package getPackage();
}
public class ConcreteBuilder extends Builder {

    private Package aPackage = new Package();

    @Override
    public void setPackage(String name, float price, List<Product> list) {
        aPackage.setName(name);
        aPackage.setPrice(price);
        aPackage.setList(list);
    }

    @Override
    public Package getPackage() {
        return aPackage;
    }
}
public class Director {
    private Builder builder = new ConcreteBuilder();

    public Package getAPackage() {
        List<Product> list = new ArrayList<>();
        list.add(new Product("可乐", 10));
        list.add(new Product("薯条", 8.9f));
        builder.setPackage("A套餐", 18.9f, list);
        return builder.getPackage();
    }

    public Package getBPackage() {
        List<Product> list = new ArrayList<>();
        list.add(new Product("可乐", 10));
        list.add(new Product("汉堡", 20.9f));
        builder.setPackage("B套餐", 30.9f, list);
        return builder.getPackage();
    }
}
posted @ 2018-10-23 10:52  fomin  阅读(145)  评论(0编辑  收藏  举报