一、场景
- 我们要建造一个复杂的产品。比如神舟飞船。这个复杂的产品的创建有一个问题需要处理:
装配这些子组件是不是有个步骤呢? - 实际开发中 ,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。
二、建造模式的本质
分离了对象子组件的单独构造(由
builder
来负责)和装配(有Director
负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。由于实现了构建和装配的解耦,不同的构建器、相同的装配,也可以做出不同的对象。相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
AirShip.java
package cn.itcast.day232.build;
//宇宙飞船
public class AirShip {
//飞船需要包含下列组件
private OrbitalModule orbitalModule;//轨道舱
private Engine engine;//发动机
private EscapeTower escapeTower;//逃逸塔
//一个发射飞船的方法
public void launch(){
System.out.println("点火");
}
public OrbitalModule getOrbitalModule() {
return orbitalModule;
}
public void setOrbitalModule(OrbitalModule orbitalModule) {
this.orbitalModule = orbitalModule;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public EscapeTower getEscapeTower() {
return escapeTower;
}
public void setEscapeTower(EscapeTower escapeTower) {
this.escapeTower = escapeTower;
}
}
class OrbitalModule{
private String name ;
public OrbitalModule(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Engine{
private String name ;
public Engine(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class EscapeTower{
private String name;
public EscapeTower(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
说明:可以看到一个飞船需要引擎、发动机、逃逸塔这些部件。
AirShipBuilder.java
package cn.itcast.day232.build;
//飞船建造者
public interface AirShipBuilder {
public Engine buildEngine();
public OrbitalModule buildOrbitalModule();
public EscapeTower buildEscapeTower();
}
SzAirShipBuilder.java
package cn.itcast.day232.build;
//神舟飞船建造者
public class SzAirShipBuilder implements AirShipBuilder {
@Override
public Engine buildEngine() {
System.out.println("构建神舟发动机");
return new Engine("神舟发动机");//当然很多情况下我们在构建组件的时候会结合工厂模式
}
@Override
public OrbitalModule buildOrbitalModule() {
System.out.println("构建神舟轨道舱");
return new OrbitalModule("神舟轨道舱");
}
@Override
public EscapeTower buildEscapeTower() {
System.out.println("构建神舟逃逸塔");
return new EscapeTower("神舟逃逸塔");
}
}
说明:如上是特定飞船(神舟飞船)的一个具体的建造者的实现,建造者主要是为特定对象构建各类所需部件。
AirShipDirector.java
package cn.itcast.day232.build;
//装配者
public interface AirShipDirector {
public AirShip directAirShip();//组装飞船
}
SzAirShipDirector.java
package cn.itcast.day232.build;
//飞船装配者
public class SzAirShipDirector implements AirShipDirector {
private AirShipBuilder builder;//装配者需要用到构建者来构建各类组件
public SzAirShipDirector(AirShipBuilder builder) {
this.builder = builder;
}
@Override
public AirShip directAirShip() {
//使用构建器构建各类组件
Engine engine = builder.buildEngine();
OrbitalModule orbitalModule = builder.buildOrbitalModule();
EscapeTower escapeTower = builder.buildEscapeTower();
//装配飞船
AirShip ship = new AirShip();
ship.setEngine(engine);
ship.setOrbitalModule(orbitalModule);
ship.setEscapeTower(escapeTower);
//将构建好的飞船返回出去
return ship;
}
}
说明:如上是一个特定装配者(神舟飞船装配者)的实现,装配者的主要功能是将建造者构建出的各个部件装配起来,实现一个具体的对象。
Client.java
package cn.itcast.day232.build;
public class Client {
public static void main(String[] args) {
AirShipDirector director = new SzAirShipDirector(new SzAirShipBuilder());
AirShip airShip = director.directAirShip();//这样我们便获得了一个飞船
System.out.println(airShip.getEngine().getName());
airShip.launch();
}
}
说明:如上可以看到当我们需要一个飞船时只需要跟装配置打交道即可。然后就能获得我们需要的相关实例对象。