1.使用场景:
1.对象的建造非常复杂,需要很多的步骤处理。
2.构建过程的每一步都不是必须要执行的,但是建造出来的还是”同一个东西”,只是出来的产品有一些属性会稍微”弱”一些。
2.UML表示
在建造者模式中有如下的一些对象:
2.1 Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
2.2 ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
2.3 Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
2.4 Product:要创建的复杂对象。
具体的UML示意图如下:
3.代码实现
这里我们通过组装一台汽车的例子,来理解这个设计模式:
首先是建造汽车的接口定义:
public interface CarBuilder {
Engine buildEngine();
Bettery buildbettery();
Suspension buildSuspension();
}
装配零件的接口定义:
public interface CarDirector {
Tesla createTesla();
}
Engine类:
public class Engine {
private String power;
public Engine(String power) {
this.power = power;
}
public String getPower() {
return power;
}
public void setPower(String power) {
this.power = power;
}
}
汽车类:
public class Tesla {
private Engine engine;
private Bettery bettery;
private Suspension suspension;
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public Bettery getBettery() {
return bettery;
}
public void setBettery(Bettery bettery) {
this.bettery = bettery;
}
public Suspension getSuspension() {
return suspension;
}
public void setSuspension(Suspension suspension) {
this.suspension = suspension;
}
}
其他的几个汽车零部件代码的比较类似,这里省略。
下面是汽车的构建类:
public class TeslaBuilder implements CarBuilder {
@Override
public Engine buildEngine() {
System.out.println("组装发动机中...");
return new Engine("10000P");//实际使用中,这边通常和工厂模式搭配,通过工厂模式来返回一个对象
}
@Override
public Bettery buildbettery() {
System.out.println("安装电池中....");
return new Bettery("1024");
}
@Override
public Suspension buildSuspension() {
System.out.println("安装悬挂中...");
return new Suspension("112");
}
}
最后是汽车的装配类,使用TeslaBuilder类中的build方法来进行装配。
public class TeslaDirector implements CarDirector {
private TeslaBuilder teslaBuilder;
public TeslaDirector(TeslaBuilder teslaBuilder) {
this.teslaBuilder = teslaBuilder;
}
@Override
public Tesla createTesla() {
Engine e=teslaBuilder.buildEngine();
Suspension s=teslaBuilder.buildSuspension();
Bettery b=teslaBuilder.buildbettery();
Tesla tesla=new Tesla();
tesla.setBettery(b);
tesla.setEngine(e);
tesla.setSuspension(s);//看到没?一步一步装的
return tesla;
}
}
4.总结
建造者模式和前面讲的抽象工厂有点”像”,但本质是不一样的,建造者模式,它是通过一步一步的装配来完成对象的创建,而对于抽象工厂,这个装配的过程是不需要考虑的,它考虑的只是如何取不同的”原材料”然后组装成一个新东西。
项目链接:
https://github.com/MemoryExplosion/design_pattern_review/tree/master/src/java/builder