建造模式的本质:
分离了对象子组件的单独构造(有Builder来负责)和装配(由Diretor负责)。从而可以构造出复杂的对象。这种模式适用于:某个对象的构建过程复杂的情况下使用。
由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、转配算法的解耦,实现了更好的复用。
/**
*北京尚学堂 建造者模式
* @author 万河归海
*
*/
public class Airship {
private Engine engine;//发动机
private OrbitalModule orbitalModule;//轨道舱
private EscapeTower escapeTower;//逃逸塔
public void launch(){
System.out.println("发射");
}
public Airship() {
}
public Airship(Engine engine, OrbitalModule orbitalModule,
EscapeTower escapeTower) {
super();
this.engine = engine;
this.orbitalModule = orbitalModule;
this.escapeTower = escapeTower;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public OrbitalModule getOrbitalModule() {
return orbitalModule;
}
public void setOrbitalModule(OrbitalModule orbitalModule) {
this.orbitalModule = orbitalModule;
}
public EscapeTower getEscapeTower() {
return escapeTower;
}
public void setEscapeTower(EscapeTower escapeTower) {
this.escapeTower = escapeTower;
}
}
class Engine{
private String name;
public Engine(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class OrbitalModule{
private String name;
public OrbitalModule(String name) {
super();
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) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public interface AirshipBuilder {
Engine engineBuilder();
OrbitalModule orbitalModuleBuilder();
EscapeTower escapeTowerBuilder();
}
public interface AirshipDirector {
/**
* 组件飞船
*/
Airship directorAirship();
}
public class SxtAirshipBuilder implements AirshipBuilder{
@Override
public Engine engineBuilder() {
System.out.println("发动机");
return new Engine("发动机");
}
@Override
public OrbitalModule orbitalModuleBuilder() {
System.out.println("轨道舱");
return new OrbitalModule("轨道舱");
}
@Override
public EscapeTower escapeTowerBuilder() {
System.out.println("逃逸塔");
return new EscapeTower("逃逸塔");
}
}
public class SxtAirshipDirector implements AirshipDirector{
private AirshipBuilder builder;
public SxtAirshipDirector(AirshipBuilder builder) {
super();
this.builder = builder;
}
@Override
public Airship directorAirship() {
Engine engine = builder.engineBuilder();
OrbitalModule orbitalModule = builder.orbitalModuleBuilder();
EscapeTower escapeTower = builder.escapeTowerBuilder();
Airship airship = new Airship(engine, orbitalModule, escapeTower);
return airship;
}
}
public class Test {
public static void main(String[] args) {
AirshipDirector air = new SxtAirshipDirector(new SxtAirshipBuilder());
Airship airship = air.directorAirship();
EscapeTower escapeTower = airship.getEscapeTower();
System.out.println(escapeTower);
airship.launch();
}
}