GOF23設計模式之建造者模式

使用場景

– 我們要建造一個複雜的產品。比如:神州飛船,Iphone。這個複雜的產品的創建。有這樣一個問題需要處理:
• 裝配這些子組件是不是有個步驟問題?

– 實際開發中,我們所需要的對象構建時,也非常複雜,有很多步驟需要處理時。

建造者模式的本質

– 分離了對象子組件的單獨構造(由Builder來負責)和裝配(由Director負責)。 從而可以構造出複雜的對象。這個模式適用於:某個對象的構建過程複雜的情況下使用。

– 由於實現了構建和裝配的解耦。不同的構建器,相同的裝配,也可以做出不同的對象;相同的構建器,不同的裝配順序也可以做出不同的對象。
也就是實現了構建算法、裝配算法的解耦,實現了更好的複用

開發中應用場景

  • StringBuilder類的append方法
  • SQL中的PreparedStatement
  • JDOM中,DomBuilder、SAXBuilder

代碼示例

假設建造飛船,則有飛船對象,飛船有自己的屬性

/**
 * 宇宙飛船
 */
public class AirShip {

    private OrbitalModule orbitalModule;//軌道艙
    private Engine engine; //發動機
    private EscapeTower escapeTower;//逃逸塔

    public void lauch(){
        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;
    }
}

定義建造者和組裝者,建築者負責裝備返回飛創內部零件,組裝者負責組裝零件,產生飛船。

public interface AirShipBuilder {

    Engine builderEngine();
    OrbitalModule builderOrbitalModule();
    EscapeTower builderEscapeTower();

}

public interface AirShipDirector {

    AirShip directAirShip();//組裝飛船
}

裝配者與建造者具體實現

public class SxtAirShipBuilder implements AirShipBuilder {


    @Override
    public Engine builderEngine() {
        System.out.println("構建尚學堂牌發動機");
        return new Engine("尚學堂牌發動機");
    }

    @Override
    public OrbitalModule builderOrbitalModule() {
        System.out.println("構建尚學堂牌軌道艙");
        return new OrbitalModule("尚學堂牌軌道艙");
    }

    @Override
    public EscapeTower builderEscapeTower() {
        System.out.println("構建尚學堂牌逃逸塔");
        return new EscapeTower("尚學堂牌逃逸塔");
    }
}
public class SxtAirShipDirector implements AirShipDirector {

    private AirShipBuilder builder;

    public SxtAirShipDirector(AirShipBuilder builder) {
        this.builder = builder;
    }

    @Override
    public AirShip directAirShip() {
        Engine engine = this.builder.builderEngine();
        EscapeTower escapeTower = this.builder.builderEscapeTower();
        OrbitalModule orbitalModule = this.builder.builderOrbitalModule();

        AirShip ship = new AirShip();
        ship.setEngine(engine);
        ship.setEscapeTower(escapeTower);
        ship.setOrbitalModule(orbitalModule);
        return ship;
    }
}

代碼調用

public class Client {

    public static void main(String[] args) {
        SxtAirShipDirector sxtAirShipDirector = new SxtAirShipDirector(new SxtAirShipBuilder());
        AirShip ship = sxtAirShipDirector.directAirShip();
        System.out.println(ship);
    }
}

可以看到,調用者,只需要與裝配者與組裝者打交道,而不需要管飛船內部構建細節,實現瞭解耦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章