上一篇文章中我们介绍了一个完整的建造者模式的创建和使用过程,过程中完整的定义了各个参与者的职责和需要完成的工作:
Builder:定义了建筑队可以完成的建造动作,并且可以返回最终完成的房子
ConCreateBuilder:具体实现了建筑队的工作过程
Director:包工头指导建筑队如何去完成房子的建造
Home:实际需要被建造出来的东西。
接下来我们来看一下建造者模式的几个简化变种:
一、我要求建造房子,并且我自己知道如何去建造门、窗、地板,可以直接告诉建筑队去做就会变成这样,也可以直接找建筑队拿到房子
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Builder builder = new ConCreateBuilder();
builder.buildWindow("window 1");
builder.buildFloor("floor m");
builder.buildDoor("door n");
// Director director = new Director(builder);
Home home = builder.buildHome();
home.speak();
}
}
从上面可以看出,我直接与建筑队沟通,告诉他们怎么去做,并且我直接找Builder拿回了我需要的Home,这样中间就舍弃掉了Director的过程,省去了包工头的事情。
二、在第一种情况的基础上,当我要一所房子的时候,我被要求建造这样的房子必须使用这一只建筑队,也就是说我的房子和这一个建筑队被绑定在一起了,那么Home就变成了这样:
public class Home {
Window window;// 有一扇窗子
Door door;// 有一扇门
Floor floor;// 有地板
public Home() {
// TODO Auto-generated constructor stub
window = new Window();
door = new Door();
floor = new Floor();
}
class Window {
String windowName;
}
class Door {
String doorName;
}
class Floor {
String floorName;
}
public void speak() {
System.out.println("i am home , my window is " + window.windowName + ", door is " + door.doorName
+ ", floor is " + floor.floorName);
}
static class ConCreateBuilder implements Builder {
Home home;
public ConCreateBuilder() {
// TODO Auto-generated constructor stub
home = new Home();
}
@Override
public void buildWindow(String windowName) {
// TODO Auto-generated method stub
home.window.windowName = windowName;
}
@Override
public void buildDoor(String doorName) {
// TODO Auto-generated method stub
home.door.doorName = doorName;
}
@Override
public void buildFloor(String floorName) {
// TODO Auto-generated method stub
home.floor.floorName = floorName;
}
@Override
public Home buildHome() {
// TODO Auto-generated method stub
return home;
}
}
}
ConCreateBuilder成了Home的内部类
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
// Builder builder = new ConCreateBuilder();
// Director director = new Director(builder);
Home.ConCreateBuilder homeBuilder = new Home.ConCreateBuilder();
homeBuilder.buildWindow("window 1");
homeBuilder.buildFloor("floor m");
homeBuilder.buildDoor("door n");
Home home = homeBuilder.buildHome();
home.speak();
}
}
在使用时,直接new一个Home的内部类Builder出来,然后给builder设置各个部件的内容。
看上面的代码,从调用上来看代码还不够简洁,做一定量的修改之后,可以使得代码的简洁性大大提高:
static class ConCreateBuilder implements Builder {
Home home;
public ConCreateBuilder() {
// TODO Auto-generated constructor stub
home = new Home();
}
@Override
public Builder buildWindow(String windowName) {
// TODO Auto-generated method stub
home.window.windowName = windowName;
return this;
}
@Override
public Builder buildDoor(String doorName) {
// TODO Auto-generated method stub
home.door.doorName = doorName;
return this;
}
@Override
public Builder buildFloor(String floorName) {
// TODO Auto-generated method stub
home.floor.floorName = floorName;
return this;
}
@Override
public Home buildHome() {
// TODO Auto-generated method stub
return home;
}
}
通过这样return this的修改,在使用的时候就变成了这样
Home.ConCreateBuilder homeBuilder = new Home.ConCreateBuilder();
homeBuilder.buildWindow("window 1").buildFloor("floor m").buildDoor("door n");
Home home = homeBuilder.buildHome();
咦,看起来是不是特别眼熟~~
没错,做过android的小伙伴们看出来了,这个和AlertDialog的创建模式简直一毛一样:
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setIcon(R.drawable.launcher).setMessage(R.string.message);
AlertDialog dialog = builder.create();
在android中,很多很多地方都用到了建造者模式。
我也是刚刚接触。还有很多地方理解的不够,不深刻,也许还有很多不对的地方,还请来过得大神们,不吝赐教。
三人行,必有我师焉~