设计模式与应用:建造者模式(生成器模式)

本文介绍建造者模式基本结构,应用场景,通过实际场景来说明,便于理解

简介

Builder模式也叫建造者模式、生成器模式,是由GoF提出的23中设计模式中的一种

建造者模式隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性(属性可能是其他类对象)的对象

通过创建一部影片进阶历程来理解建造者模式

  • 第一阶级:当初需要一部军事题材的电影,领导自己就傻乎乎的一点一点的制作完一部电影。
  • 第二阶级:领导出了几部电影后发现,自己干的事情太累了,身上一堆事情,军事题材又是自己干,爱情题材又是自己干,文艺题材又是自己干,烦。然后领导就去招聘各种题材的专职电影制作组织,合作。需要什么题材的电影就找到手下的那个组织去制作。
  • 第三阶级:领导又发现有新的电影就要叫手下的组织过来吩咐制作,每天每次都要接触那么多人,开那么多会议,又是,烦。想办法招个人来做这件事情,自己多点空闲时间。然后就找了一个专职导演,有新电影制作就直接跟导演沟通,让导演指挥之前的对应题材的制作团队去完成。

以上一个现实模拟,领导的角色就是客户端,我们总是想让客户端透明的完成一件事情,不让他过多的参与事情的完成过程,很多设计模式都基于此方面的考虑的。

结构

建造者

应用场景

  • 对象的创建:Builder模式是为创建对象而设计的
  • 创建复合对象:对象是具有复合属性(其他引用类型作为属性)的对象
  • 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法

实现

建造者类图

房子相关结构类

package com.mym.designmodel.builder;

/**
 * 职责:Product 目标构建对象。(拥有复合属性)
 */
public  class Hourse{

    private HourseFloor hourseFloor;

    private HourseWall hourseWall;

    private HourseTop hourseTop;

    public void setHourseFloor(HourseFloor hourseFloor) {
        this.hourseFloor = hourseFloor;
    }

    public void setHourseWall(HourseWall hourseWall) {
        this.hourseWall = hourseWall;
    }

    public void setHourseTop(HourseTop hourseTop) {
        this.hourseTop = hourseTop;
    }

    @Override
    public String toString() {
        return "Hourse:HourseFloor[width:"+hourseFloor.width+",lenght:"+hourseFloor.length+"]" +
                "\t" + "HourseWall[width:"+hourseWall.width+",height:"+hourseWall.height+"]" +
                "\t" + "HourseTop[heigth:"+hourseTop.height+",angle:"+hourseTop.angle+"]";
    }
}
package com.mym.designmodel.builder;

/**
 * 房子地板
 */
public class HourseFloor {
    public int width;
    public int length;
}
package com.mym.designmodel.builder;

/**
 * 房子墙体
 */
public class HourseWall {
    public int width;
    public int height;
}
package com.mym.designmodel.builder;

/**
 * 房子屋顶
 */
public class HourseTop {
    public int height;  //高
    public float angle;//倾角
}

建造者接口

package com.mym.designmodel.builder;

/**
 * 职责:Builder 建造者的统一接口
 */
public interface HouseBuilder {

    public void makeFloor();

    public void makeWall();

    public void makeHouseTop();

    public Hourse getHourse();
}

具体房子建造者(工程队)

package com.mym.designmodel.builder;

/**
 * 职责: concreteBuilder 建造者 别墅工程队
 */
public class BieShuHourseBuilder implements HouseBuilder {
    private Hourse hourse = new Hourse();

    @Override
    public void makeFloor() {
        System.out.println("建造 bieshuHouse 的地板");
        HourseFloor hourseFloor = new HourseFloor();
        hourseFloor.width = 800;
        hourseFloor.length = 800;
        hourse.setHourseFloor(hourseFloor);
    }

    @Override
    public void makeWall() {
        System.out.println("建造 bieshuHouse 的墙体");
        HourseWall hourseWall = new HourseWall();
        hourseWall.height = 2000;
        hourseWall.width = 2000;
        hourse.setHourseWall(hourseWall);
    }

    @Override
    public void makeHouseTop() {
        System.out.println("建造 bieshuHouse 的房顶");
        HourseTop hourseTop = new HourseTop();
        hourseTop.angle = 0.10f;
        hourseTop.height = 900;
        hourse.setHourseTop(hourseTop);
    }

    @Override
    public Hourse getHourse() {
        return hourse;
    }
}

第二个建造者(工程队)

package com.mym.designmodel.builder;

/**
 * 职责:concreteBuilder 具体建造者.哥特式房子建造者
 */
public class GeTeShiHouseBuilder implements HouseBuilder{
    private Hourse hourse = new Hourse();

    @Override
    public void makeFloor() {
        System.out.println("建造 GeTeShiHouse 的地板");
        HourseFloor hourseFloor = new HourseFloor();
        hourseFloor.width = 500;
        hourseFloor.length = 500;
        hourse.setHourseFloor(hourseFloor);
    }

    @Override
    public void makeWall() {
        System.out.println("建造 GeTeShiHouse 的墙体");
        HourseWall hourseWall = new HourseWall();
        hourseWall.height = 1000;
        hourseWall.width = 1000;
        hourse.setHourseWall(hourseWall);
    }

    @Override
    public void makeHouseTop() {
        System.out.println("建造 GeTeShiHouse 的房顶");
        HourseTop hourseTop = new HourseTop();
        hourseTop.angle = 0.50f;
        hourseTop.height = 100;
        hourse.setHourseTop(hourseTop);
    }

    @Override
    public Hourse getHourse() {
        return hourse;
    }

}

建造者的统筹者(类比房子的设计者)

package com.mym.designmodel.builder;

/**
 * 职责:Director 建造者统筹者
 */
public class HourseDirector {

    public Hourse makeHourse(HouseBuilder houseBuilder){
        houseBuilder.makeFloor();
        houseBuilder.makeWall();
        houseBuilder.makeHouseTop();
        return houseBuilder.getHourse();
    }
}

测试

package com.mym.designmodel.builder;

/**
 * 测试
 */
public class MainClass {

    public static void main(String[] args) {
        //创建工程队(建造者)
        HouseBuilder houseBuilder = new GeTeShiHouseBuilder();
        //建造者开始创建,开工
        houseBuilder.makeFloor();
        houseBuilder.makeWall();
        houseBuilder.makeHouseTop();

        //查看建造好的房子
        Hourse hourse = houseBuilder.getHourse();
        System.out.println(hourse);

        System.out.println("----------------------------");

        //建造者统筹者建房
        HourseDirector hourseDirector = new HourseDirector();
        Hourse hourse1 = hourseDirector.makeHourse(new BieShuHourseBuilder());
        System.out.println(hourse1);
    }

}

结果:

建造 GeTeShiHouse 的地板
建造 GeTeShiHouse 的墙体
建造 GeTeShiHouse 的房顶
Hourse:HourseFloor[width:500,lenght:500]    HourseWall[width:1000,height:1000]  HourseTop[heigth:100,angle:0.5]
----------------------------
建造 bieshuHouse 的地板
建造 bieshuHouse 的墙体
建造 bieshuHouse 的房顶
Hourse:HourseFloor[width:800,lenght:800]    HourseWall[width:2000,height:2000]  HourseTop[heigth:900,angle:0.1]

总结

可能乍一看,建个房子,觉得这么多乱七八糟的步骤,太繁杂了吧。

实际上,需要深入理解建造者模式的应用场景和关注点,应用场景上文已经说明,关注点这里在说明一下:

  • 建造者关注的是建房的复杂建造过程,是concreteBuilder中的过程。
  • 适用的是具有复杂属性构造对象,且对象会多态的情景

猜你喜欢

转载自blog.csdn.net/maoyuanming0806/article/details/80193638