建造者模式与外观模式都是统一了接口,方便访问,个人认为它们之间的不同主要是建造者模式更关系该接口内部实现逻辑(比如实现顺序等),而外观模式对该统一的接口内部实现不太关注,如果把建造者模式的Director和抽象类(PersonBuilder)合二为一,就成了外观模式。这一点也可以与上一篇文章做对比,在外观模式中,列举了股票(stock)、国债(nationalDebt)和房地产(realty)三中,共五个类,在建造者模式中,只列举了两种,也是5个类,说明建造者模式只是把外观模式其中的一个类一分为二而已。
因此,当需要统一的接口内的实现比较多变时,可以使用建造者模式,业务变化时扩展Director类即可
重写书中代码时,为了方便,只写了buidHead方法和buildBody方法,并且不使用书中的画图(如Graphics、Color等),只是单纯的打印
UML
代码结构
public class Client {
public static void main(String[] args) {
PersonBuilder ptb = new PersonThinBuilder();
PersonDirector pdThin = new PersonDirector(ptb);
pdThin.createPerson();
System.out.println("------------------------------");
PersonBuilder pfb = new PersonFatBuilder();
PersonDirector pdFat = new PersonDirector(pfb);
pdFat.createPerson();
}
}
public abstract class PersonBuilder {
abstract void buildHead();
abstract void buildBody();
}
public class PersonDirector {
private PersonBuilder pb;
public PersonDirector(PersonBuilder pb) {
super();
this.pb = pb;
}
public void createPerson() { //封装了建造过程,过程变化时扩展Director类即可
pb.buildHead();
pb.buildBody();
}
}
public class PersonFatBuilder extends PersonBuilder {
@Override
void buildHead() {
System.out.println("fat person head");
}
@Override
void buildBody() {
System.out.println("fat person body");
}
}
public class PersonThinBuilder extends PersonBuilder {
@Override
void buildHead() {
System.out.println("thin person head");
}
@Override
void buildBody() {
System.out.println("thin person body");
}
}
运行结果