模式讲解:
- 设计者(Designer)和客户(Client)沟通明确需求
- 沟通后设计者将客户创建产品的需求划分为各个部件的建造请求(Builder)
- 将各个部件的建造请求委派到具体的建造者(WorkBuilder)
- 各个具体建造者负责进行产品部件的构建
- 最终构建成具体产品(Room)
抽象构建者
/**
* 抽象建造者角色
* 这是建造房子的通用功能,任何房子的构建过程都需要或者部分需要这些功能,只是具体的构建情况因房而异
* 具体的建造者需要遵循这些建造规则,所以具体的构建者继承这个接口
*/
public interface Build {
public void makeWindow();
public void makeFloor();
public Room getRoom();
}
具体构建者
/**
* 具体构建者,遵从构建规则,实现定制化的建造
* 它针对的是当前这所房子,所以持有这所房子的引用
*/
public class WorkBuilder implements Build{
private Room room=new Room();
@Override
public void makeWindow() {
room.setWindow("窗户");
}
@Override
public void makeFloor() {
room.setFloor("地板");
}
@Override
public Room getRoom() {
return room;
}
}
产品
/**
* 房子类 这是要建造的产品
* 产品具有自己的属性,这也是建造者将要完成的工作就是给这些属性赋值
*/
public class Room {
private String window;
private String floor;
public String getWindow() {
return window;
}
public void setWindow(String window) {
this.window = window;
}
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "---->floor "+floor+" window "+window;
}
}
设计师
/**
* 设计师 他知道房子怎么设计
* 他会指挥工人去建造
* 实际生活中 大厦的设计者并不会看大厦的具体实现细节
* 更多的是从整体角度出发,指挥这个工人团队建造
* 所以他肯定对工人所具备的能力和行为有很深的了解
* 换做程序代码中 ,他也肯定会持有工人 的这个对象的引用
*/
public class Designer {
public void order(Build build)
{
build.makeFloor();
build.makeWindow();
}
}
开始构建
public class Client {
public static void main(String[] args) {
Build worker = new WorkBuilder(); //获取工人对象
Designer designer = new Designer(); //获取设计师对象
designer.order(worker); //设计师指挥工人工作
System.out.println(worker.getRoom());; //工人交房
}
}
上边是一种标准的建造者模式,但是一般在开发中我们不会按照这种方式来构建代码,接下来进行第一次重构
第一次重构
将抽象建造者和设计师角色去掉,在具体的建造者中增加一个RoomParmas用于存储Room每个属性,上一种写法是相当于得到一个材料之后就将对应的部件构建出来,而这次我们先获取到所有的材料,等材料齐全,一次性构建出产品,所有的材料都存储在RoomParmas中
重构后的具体构建者
public class WorkBuilder{
private RoomParmas parmas;
public WorkBuilder( ) {
this.parmas = new RoomParmas();
}
public WorkBuilder makeWindow(String window ) {
parmas.window=window;
return this;
}
public WorkBuilder makeFloor(String floorCorlor) {
parmas.floor=floorCorlor;
return this;
}
public WorkBuilder makeDoor(String door) {
parmas.door=door;
return this;
}
/**
*构建时把参数传递到Room中
*/
public Room build() {
Room room=new Room();
room.apply(parmas);
return room;
}
/**
*这个内部类存储的属性和Room产品保持一致
*/
class RoomParmas {
public String window;
public String floor;
public String door;
}
}
产品类
public class Room {
private String window;
private String floor;
private String doorl;
@Override
public String toString() {
return "---->floor "+floor+" window "+window;
}
/**
* 这个方法用于接收构建者传递的参数
* @param parmas
*/
public void apply(RoomParmas parmas) {
window=parmas.window;
floor=parmas.floor;
doorl=parmas.door;
}
}
开始构建
public class Client {
public static void main(String[] args) {
Room room=(new WorkBuilder()).makeWindow("蓝色玻璃").makeFloor("黄色地板").build(); //获取产品对象
System.out.println(room);; //工人交房
}
}
第二次重构
我们看到,第一次重构的结果中,具体的构建者何产品类还相互独立,但是一般开发中我们为了简化代码结构,可以将具体的构建者设置到产品类中作为一个内部类来实现,可以看的出来,这种结构已经非常类似android中的AlertDialog了,这就是我们最终的结果
Room:
public class Room {
private String window;
private String floor;
private String doorl;
@Override
public String toString() {
return "---->floor "+floor+" window "+window;
}
public static class WorkBuilder{
private RoomParmas parmas;
public WorkBuilder( ) {
this.parmas = new RoomParmas();
}
public WorkBuilder makeWindow(String window ) {
parmas.window=window;
return this;
}
public WorkBuilder makeFloor(String floorCorlor) {
parmas.floor=floorCorlor;
return this;
}
public WorkBuilder makeDoor(String door) {
parmas.door=door;
return this;
}
public Room build() {
Room room=new Room();
room.apply(parmas);
return room;
}
static class RoomParmas {
public String window;
public String floor;
public String door;
}
}
/**
* 这个方法用于接收构建者传递的参数
* @param parmas
*/
public void apply(RoomParmas parmas) {
window=parmas.window;
floor=parmas.floor;
doorl=parmas.door;
}
}