Java设计模式之建造者模式

Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

 

  • Dircector:设计者类。该类的作用是指挥建造者对象动态的建造产品。
  • Builder:建造者类。执行真正的建造工作。
  • ConcreteBuilder:具体建造者类。包含具体的工作细节。
  • Product:产品类。通过建造者类建造出来的产品。

 

实际上建造者设计模式和工厂设计模式很相似,只不过建造者模式多了一个设计者类。下面我们来实现一个简单的案例,作为一个简单的案例,代码中没有编写抽象建造者类,但是并不妨碍对于建造者类的理解。

 

产品类

/*
* 定义一个房子产品类
* 房子需要地板(floor)、墙面(wall)和屋顶(roof)
* */
class House{
    private String floor;
    private String wall;
    private String roof;
    public void setFloor(String floor) {
        this.floor = floor;
    }
    public void setWall(String wall) {
        this.wall = wall;
    }
    public void setRoof(String roof) {
        this.roof = roof;
    }
    public String toString(){
        return "House:["+floor+","+wall+","+roof+"]。";
    }
}

 

建造者类

/*
* 定义一个建造者类,传递产品类进去进行生产
* 把它当做一个工程队
* 建造者类有能力完成建房子的任务
* 但是它并没有房子的设计图
* */
class HouseBuilder{
    private House house;
    public HouseBuilder(House house){
    this.house = house;
}

    public void cBuildFloor() {
        house.setFloor("Use Cheapfloor");
    }

    public void cBuildWall() {
        house.setRoof("Use Cheapfloor");
    }

    public void cBuildRoof() {
        house.setWall("Use CheapWall");
    }

    public void eBuildFloor() {
        house.setFloor("Use Expenfloor");
    }

    public void eBuildWall() {
        house.setRoof("Use Expenfloor");
    }

    public void eBuildRoof() {
        house.setWall("Use ExpenWall");
    }

    public House getHouse() {
        return house;
    }

}

 

设计者类

/*
* 定义设计者类
* 它提供一个设计图(design)给工程队(HouseBuilder)
* 这里按需求都使用了便宜的建造流程
* Cheap(便宜)、Expen(贵)
* */
class Director{
    private HouseBuilder houseBuilder;
    public Director(HouseBuilder houseBuilder){
        this.houseBuilder = houseBuilder;
    }
    public void design(){
        houseBuilder.cBuildFloor();
        houseBuilder.cBuildRoof();
        houseBuilder.cBuildWall();
    }
}

 

测试代码:

House house = new House();
HouseBuilder builder = new HouseBuilder(house);

Director director = new Director(builder);
director.design();

/*
* 向工程队要取房子
* */
System.out.println(builder.getHouse());

/*
* Output:
House:[Use Cheapfloor,Use CheapWall,Use Cheapfloor]。
* */

 

posted @ 2018-12-24 11:43  问月晚安  阅读(152)  评论(0编辑  收藏  举报