创建型-建造者模式 Link to heading

建造者模式所完成的内容就是通过将多个简单对象通过一步步的组装构建出一个复杂对象的过程。

模拟场景 Link to heading

模拟装修公司对于设计出一些套餐装修服务的场景

吊顶、涂料、地板、地砖等

最初设计 Link to heading

物料接口

public interface Matter {
  
    String scene(); // 场景
  
    String brand();	// 品牌
  
    String model(); // 型号
  
    BigDecimal price();	// 价格
  
    String desc();	// 描述
}

使用

public class DecorationPackageController{
  public List<Matter> getMaterList(BigDecimal area, int type){
    List<Matter> list = new ArrayList<Matter>();
    BigDecimal price = BigDecimal.Zero;
    if(1 == type){
      // do something
    } else(2 == type){
      // do something
    } else(3 == type){
      // do somgting
    }
    return list;
  }
}

改进方案 Link to heading

工程结构

└─design
  ├─Builder.java
  ├─DecorationPackageMenu.java
  └─IMenu.java

工程有三个核心,核心类是建造者模式的具体实现。

  • Builder:建造者类具体的各种组装由此类实现。
  • DecorationPackageMenu是IMenu的接口实现,主要是承载建造过程中的填充物。想到雨这是一套承载物料和创建者中间衔接的内容。

定义装修包接口

public interface IMenu{
  // 吊顶
  IMenu appendCeiling(Matter matter);
  
  // 涂料
  IMenu appendCoat(Matter matter);
  
  // 地板
  IMenu appendFloor(Matter matter);
  
  // 地砖
  IMenu appendTile(Matter matter);
  
  // 明细
  String getDetail();
}

装修包实现

public class DecorationPackageMenu implements IMenu{
  private List<Matter> list = new ArrayList<Matter>();
  private BigDecimal prive = BigDecimal.ZERO;
  private BigDecimal area;
  private String grade;
  
  public DecoartionPackageMenu(Double area,String grade){
    this.area = new BigDecimal(area);
    this.grade = grade;
  }
  
  public IMenu appendCeiling(Matter matter){
    // do sth
    return this;
  }
  
  public IMenu appendCoat(Matter matter){
    // do sth
    return this;
  }
  
  public IMenu appendFloor(Matter matter){
    // do sth
    return this;
  }
  
  public IMenu appendTile(Matter matter){
    // do sth
    return this;
  }
}

装修包的实现中每个方法都会return this,就可以非常方便的用于连续填充数据。

建造者方法

public class Builder{
  public IMenu levelOne(Double area){
    return new DecorationPackageMenu(area,"豪华装修")
      .appendCeilling(new MatterA())
      .appendCoat(new MatterB())
      .appendFloor(new MatterC());
  }
}

总结 Link to heading

当一些基本物料不变,且组合经常变化的时候,可以选择这样的设计模式来构造代码。

此模式满足了单一职责原则及可服用的技术,建造者独立、易扩展、便于控制细节风险。