本文介绍建造者模式基本结构,应用场景,通过实际场景来说明,便于理解
简介
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中的过程。
- 适用的是具有复杂属性构造对象,且对象会多态的情景