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

• 场景:
– 我们要建造一个复杂的产品。比如:神州飞船,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();      
}

}

猜你喜欢

转载自www.cnblogs.com/wjnxyq/p/10810295.html