GOF 23种设计摩搜-建造者模式

时间:2021-10-14 08:01:55

• 场景:

– 我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样

一个问题需要处理:

• 装配这些子组件是不是有个步骤问题?

– 实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。

• 建造模式的本质:

– 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构

造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。

– 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;

相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配

算法的解耦,实现了更好的复用。

• 开发中应用场景:

– StringBuilder类的append方法

– SQL中的PreparedStatement

– JDOM中,DomBuilder、SAXBuilder

举例:构建 白纸牌宇宙飞船

//白纸牌宇宙飞船

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 String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public EscapeTower(String name) {
super();
this.name = name;
}

}

//搭建宇宙飞船构造接口

public interface AirShipBuilder {

Engine builderEngine();

OrbitalModule builderOrbitalModule();

EscapeTower builderEscapeTower();

}

//搭建宇宙飞船接口实现类

public class SxtAirShipBuilder implements AirShipBuilder {

@Override

public Engine builderEngine() {

System.out.println("构建发动机!");

return new Engine("白纸牌发动机!");

}

@Override
public EscapeTower builderEscapeTower() {
System.out.println("构建逃逸塔");
return new EscapeTower("白纸牌逃逸塔");
} @Override
public OrbitalModule builderOrbitalModule() {
System.out.println("构建轨道舱");
return new OrbitalModule("白纸牌轨道舱");
}

}

//组装飞船接口

public interface AirShipDirector {

AirShip directAirShip();

}

//组装飞船对象接口实现类

public class SxtAirshipDirector implements AirShipDirector {

private AirShipBuilder builder;

public SxtAirshipDirector(AirShipBuilder builder) {

this.builder = builder;

}

@Override
public AirShip directAirShip() {
Engine e = builder.builderEngine();
OrbitalModule o = builder.builderOrbitalModule();
EscapeTower et = builder.builderEscapeTower(); //装配成飞船对象
AirShip ship = new AirShip();
ship.setEngine(e);
ship.setEscapeTower(et);
ship.setOrbitalModule(o); return ship;
}

}

//测试

public class Client {

public static void main(String[] args) {

	AirShipDirector director = new SxtAirshipDirector(new SxtAirShipBuilder());

	AirShip ship = director.directAirShip();

	System.out.println(ship.getEngine().getName());

	ship.launch();
}

}