// 接上一篇
建造者模式
基于上一篇的图继续~
思路就是:
- 消费者自己new出一个房子显然不现实,所以消费者请了worker帮忙造房子(house上加了一层worker)
- 消费者管理worker的实现步骤显然太麻烦,所以消费者请了director帮忙看着worker(worker上加了一层director)
- 这样消费者只用挑选合适的director和worker,house就创建出来了
下面看代码:
先写好写的House和BuilderMap
public class House {
// 房子由四部分组成
private Roof roof; // 屋顶由工厂模式提供,其余暂时用字符串代替
private String wall;
private String ground;
private String outside;
public Roof getRoof() { return roof; }
public String getWall() { return wall; }
public String getGround() { return ground; }
public String getOutside() { return outside; }
@Override
public String toString() {
String msg = "建造出来的房子外观是: \n" +
"屋顶:"+roof.getMaterial() + "\n"
+ "墙壁:"+ wall + "\n"
+ "地板:"+ ground + "\n"
+ "外围有:"+ outside;
return msg;
}
}
public interface BuilderMap {
// 造房子的四步
void step4Roof();
void step4Wall();
void step4Ground();
void step4Outside();
// 交付产品
House getHouse();
}
接下来看工人类,工人类是对图纸的具体实现
工人1和工人2对于图纸的实现不一样。
工人1是女生,她用木头造屋顶,她喜欢粉色所以墙被砌成粉色,周围种很多绿化;工人2是男生,他用铁造屋顶,喜欢把墙涂成黄色,周围建停车场能赚钱
public class Worker1 implements BuilderMap {
private House house;
public Worker1() {
house = new House(); // 由工人1负责创建产品
}
@Override
public void step4Roof() {
Roof roof = new WoodenRoofFactory().getRoof();
house.setRoof(roof);
}
@Override
public void step4Wall() { house.setWall("粉色"); }
@Override
public void step4Ground() { house.setGround("粉色"); }
@Override
public void step4Outside() { house.setOutside("绿化带"); }
@Override
public House getHouse() { return house; }
}
public class Worker2 implements BuilderMap {
private House house;
public Worker2() {
house = new House(); // 由工人2负责创建产品
}
@Override
public void step4Roof() {
Roof roof = new IronRoofFactory().getRoof();
house.setRoof(roof);
}
@Override
public void step4Wall() { house.setWall("黄色"); }
@Override
public void step4Ground() { house.setGround("黄色"); }
@Override
public void step4Outside() { house.setOutside("停车场"); }
@Override
public House getHouse() { return house; }
}
接下来就是包工头登场了
包工头根据图纸指挥工人按步骤干活
包工头1是个普通人,决定先打地基再砌墙;包工头2不是一般人,他决定先砌墙再打地基
public class Director1 {
public House build(BuilderMap builderMap) {
builderMap.step4Ground();
builderMap.step4Wall();
builderMap.step4Roof();
builderMap.step4Outside();
return builderMap.getHouse();
}
}
public class Director2 {
public House build(BuilderMap builderMap) {
builderMap.step4Wall();
builderMap.step4Ground();
builderMap.step4Roof();
builderMap.step4Outside();
return builderMap.getHouse();
}
}
最后是消费者端:
public class Client {
public static void main(String[] args) {
Director1 director1 = new Director1();
// 包工头1 指挥 工人1 完成房子1建造
House house1 = director1.build(new Worker1());
System.out.println(house1.toString());
Director2 director2 = new Director2();
// 包工头2 指挥 工人2 完成房子2建造
House house2 = director2.build(new Worker2());
System.out.println(house2.toString());
}
}
打印结果如下:
总结
与工厂模式相比,建造者模式返回的是一个完整的产品,而工厂模式返回的是一系列相关的或大或小的产品。
在造房子的例子中,我使用了工厂模式造屋顶,使用建造者模式造房子。
设计模式更多体现的是在不同的场景下的应对思路的差异,至于实现大多是向上再封装一层