1.定义:将一个复杂的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
2.角色:
2.1 抽象建造者:给出一个抽象接口,定义了各个工人所需要进行的工作,这些工作是为了完成对房子的创建,就像工地会有指导手册一样。
2.2 具体建造者:具体的建造者(农民工)去建房子,房子造完后需要将房子交付给房屋主人,所以需要返回房子的方法
2.3 设计者(指导者):他知道房子怎么设计,他会指挥工人去建造(换做程序代码中,他也肯定会持有工人的这个对象的引用,所以他肯定对工人所具备的能力和行为有很深的了解)从整体角度出发,什么样的房子都能建成,他所具备的功能可以覆盖你所有的需求,哪怕业主提出的需求很简单,但是他所具备的能力必须全部覆盖
2.4.产品(房子):房子会有哪些属性
3.使用场景:复杂的对象,不同的表示方法
传统使用方式:
/**
* 抽象建造者(建造者角色)
* 工人接口,定义了各个工人所需要进行的工作
* 并不负责具体的建造
* 同时房子是具体的(农民工)建造的 所以需要有返回房子的方法
*/
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.setFloor("地板 ");
}
@Override
public void makeFloor() {
room.setWindow("窗户");
}
@Override
public Room getRoom() {
return room;
}
}
/**
* 设计者(指导者 角色)
* 所具备的能力
*
* 设计师 他知道房子怎么设计
* 他会指挥工人去建造
* 实际生活中 大厦的设计者并不会看大厦的具体实现细节
* 更多的是从整体角度出发,指挥这个工人团队建造
* 所以他肯定对工人所具备的能力和行为有很深的了解
* 换做程序代码中 ,他也肯定会持有工人 的这个对象的引用
*/
public class Designer {
public void order(Build build){
build.makeFloor();
build.makeWindow();
}
}
/**
* 房子类
* 首先要描述下 房子要有些什么
* 有哪些属性
*/
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 Client {
public static void main(String[] args) {
Build worker = new WorkBuilder(); //获取工人对象
Designer designer = new Designer(); //获取设计师对象
designer.order(worker); //设计师指挥工人工作
System.out.println(worker.getRoom());; //工人交房
}
}
项目中的使用方式:
会将房子参数配置以内部类的形式写在建造者里面
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;
}
public Room makeChat(String chat) {
parmas.chat=chat;
Room room=new Room();
return room;
}
public void show()
{
}
public Room build() {
Room room=new Room();
room.apply(parmas);
return room;
}
class RoomParmas
{
public String window;
public String floor;
public String door;
public String chat;
}
}
而调用方式采用 链式调用,可以参考AlertDialog源码
public class Client {
public static void main(String[] args) {
Room room=(new WorkBuilder()).makeWindow("蓝色玻璃").makeFloor("黄色地板").makeChat("").show();; //获取工人对象
System.out.println(room);; //工人交房
}
}
总结:1.参数配置为内部类形式
2.使用者调用采用链式调用方式,参数可配置化