01- 构建者模式(Builder Pattern)

设计模式 构建者模式

概述: 当创建复杂对象的时候,可以使用构建者模式,把创建复杂对象的过程分离出来,并且保持对象内不同组合的灵活性。

角色和类图:

builder.png

产品(Product): 需要创建的复杂对象
构建者接口(Builder):构建者的接口抽象,把创建复杂对象的过程进行分步操作,支持流式编程
具体构建者(ConcreteBuilder):构建者的具体实现,通过build() 返回创建的产品。
指导者(Director): 使用构建器,按照步骤构建,最终获得需要的产品。

详细描述:

当某个产品对象,包含多种组合,例如套餐可以选择加可乐、蛋挞、薯条、汉堡、鸡翅等等,创建出符合需要的套餐,那创建某种套产的时候,需要一个参数完备的构造器。例如:

public Class Product {
  public Product(String name, Chip chip, Cola cola, Hamberger hamberger, Tart tart, Pie pie, Chicken chicken) {
    ....
  }
}

要记住这么长的产生顺序是很麻烦的,而且为了方便,可以重载出各种各样的构造器。

构建者模式可以解决这个问题,使得创建这种复杂的对象更轻松和优雅。

public Class Product {
     private Chip chip;
     private Cola cola;
    Product(Cola cola, Chip, chip) {
      this.chip = chip;
      this.cola = cola;
    }
    @Override
    public String toString() {
      return "Product: " + chip + "," + cola ;
    }
}

public Interface Builder {
  Builder withChip(Chip chip);
  Builder withCola(Cola cola);
  Product build();
}

public Class KFCBuilder implements Builder {
  private Chip chip;
  private Cola cola;
  public KFCBuilder() {  
  }
  
  Builder withChip(Chip chip) {
    this.chip = chip;
  }
  Builder withCola(Cola cola) {
    this.cola = cola;
  }
  Product toBuild() {
    return new product(chip, cola);
  }
}

public Class Director {
  public static void main(String) {
    Builder builder = new KFCBuilder();
    Product product = builder.withChip(new Chip()).withCola(new Cola()).build();
    System.out.println(product);
  }
}

在实际使用中,有一些变化,

  1. 构建器接口不是必须的,虽然会依赖具体实现,有的产品可能始终只需要一个具体构建器。
  2. 构建器有时候会是Product的public的静态内部类,这样builder的方法就可以访问到Product的域。

真实场景:

  1. StringBuilder

  2. rabbitmq-java-client

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。