demo描述:盖房子,根据需要可以盖普通房子,也可以盖高楼,无论盖什么样的房子,它们的流程类似。
demo代码:
抽象建造者,产品蓝图、规定建造产品的必要步骤,托管产品的实例化:
public abstract class HouseBuilder {
protected House house = new House();
//建造的必要步骤
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void roofed();
public House buildHouse(){
return house;
}
}
具体建造者,实现蓝图,根据需求的差异给出不同的实现:
public class CommonHouse extends HouseBuilder{
@Override
public void buildBasic() {
System.out.println("普通房子打地基5米");
}
@Override
public void buildWalls() {
System.out.println("普通房子砌墙10米");
}
@Override
public void roofed() {
System.out.println("普通房子的小屋顶");
}
}
public class HighBuilding extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("高楼打地基100米");
}
@Override
public void buildWalls() {
System.out.println("高楼砌墙20米");
}
@Override
public void roofed() {
System.out.println("高楼的华丽屋顶");
}
}
产品,建造者的建造对象:
@Data
public class House {
private String baise;
private String wall;
private String roofed;
}
指挥者,指挥建造者建造出产品:
public class HouseDirector {
HouseBuilder houseBuilder = null;
// 构造器传入 HouseBuilder
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
// 建造房子的流程交给指挥者
public House constructHouse(){
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.roofed();
return houseBuilder.buildHouse();
}
}
客户端:
public class Client {
public static void main(String[] args) {
CommonHouse commonHouse = new CommonHouse();
HouseDirector houseDirector = new HouseDirector(commonHouse);
House house = houseDirector.constructHouse();
}
}
demo类图:
类图分析:由图可以看出建造者模式将同一类的不同实现做了一个抽象,抽象出来房子(2位置)这一产品,将产品的实例化过程描述、实例化交给了抽象建造者,将产品类不同的实现做成了具体的建造者,由具体建造者完成产品具体的描述(实现方式、顺序)。到这儿产品有了、建造者也有了,谁来将这两个类联系起来完成最终产品的生产——指挥者,指挥者组织建造的各个步骤,然后再调用抽象建造者中实例化产品的方法创建出产品。如果要增加新的产品,只要产品的构建流程类似,在1处增加新的产品描述就行。
(产品的描述可以看成是产品的属性的set方法,将产品的set与实例化分离,具体建造者给产品不同的set值,从而使客户端get到属性相同属性值不同的产品)
适用场景:产品有较多的共同点、组成部分相似;注意,当产品内部变化复杂的时候会导致要有很多建造者来实现这些变化,使系统庞大,所以用此模式时要考虑好产品的后期变化。
总结:工厂系列方法将产品实例化与使用相分离,关注点在如何将复杂的、多样的对象创建出来供使用者使用;建造者模式更加关注产品建造流程的抽象,将相似的流程提取出来,以不同的实现方式实现这些流程从而产生不同的产品;相比之下,工厂里没有规则、流程这一概念,也正因此,可生产的产品可具有两重维度,而建造者更像是一个具有生产规则的工厂,可以通过规则的不同落实方式生产不同的产品,流程规范化的代价就是产品的维度降低了。