设计模式(三)建造者模式

177 阅读2分钟

1.介绍

建造者模式又叫生成器模式,是一种对象构建模式,可以将复杂对象的建造过程过程抽离,使这个抽象过程的不同实现方法可以构造出不同属性的对象。他是一步一步创建一个复杂对象,允许用户只通过指定复杂对象的类型和内容就可以构建他们,用户不需要知道内部具体的构建细节。

2.四个角色

(1)Product(产品角色):一个具体的产品对象

(2)Builder(抽象建造者) : 创建一个Product对象的各个部件指定的接口/抽象类。只需指定建造流程

(3)ConcreBuilder(具体建造者) :实现接口,构建和装配各个部件,实现具体建造细节

(4)Director(指挥者) : 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象,主要有两个作用,一个是隔离了客户与对象的生产过程,另一个是负责控制产品对象的生产过程。

image.png

例子

image.png

js

public class House{
   private String baise;
   private String wall;
   private String roofed;
   
   get()....
   set()....
}

public abstract class HouseBuilder{
    protected House house = new House();
    public abstract void buildBasic();
    public abstract void buildWalls();
    public abstract void roofed();
    
    //建造好
    public House build(){
        return house;
    }
}

// 把制造流程和产品本身解耦
public class CommonHouse extends HouseBuilder{
   // 实现具体方法
   public void buildBasic(){}
   public void buildWalls(){}
   public void roofed(){}
}

public class HightHouse extends HouseBuilder{
   // 实现具体方法
   public void buildBasic(){}
   public void buildWalls(){}
   public void roofed(){}
}

public class HouseDirector{
  HouseBuilder houseBuilder = null;
  public HouseDirector(HouseBuilder houseBuilder){
      this.houseBuilder = houseBuilder;
  }
  
  //指挥者处理建造房子的流程
  
  public House constructHouse(){
      houseBuilder.buildBasic();
      houseBuilder.buildWalls();
      houseBuilder.roofed();
      return houseBuilder.build(); 
  }
}

public classs Client{
  main(){
     //准备盖普通房子
     CommonHouse commonHouse = new CommonHouse();
     //创建房子的指挥者
     HouseDirector houseDirector = new HouseDirector(commonHouse)
     House house houseDirector.constructHouse();
  }
}

js

let Builder = (function () {
    // 决定房子入住人数
    function rooms(peopleCount) {
        if(peopleCount <= 0) throw new Error("入住人数异常");
        this.peopleCount = peopleCount < 3 ? 2 : peopleCount 
    }
    //决定房子面积
    function setArea(area){
         if(area <= 20) throw Error("房子面积过小")
        this.area = area
    }
    //决定房子风格
    function style(style){
        this.style = style
    }
    return class{
        constructor(PeopleCount,area,Style){
            rooms.call(this, PeopleCount)
            setArea.call(this, area);
            style.call(this, Style)
        }
    }
})()
let bighouse = new Builder(3,100,'中式'),
   smallHouse = new Builder(3,50,'欧式');