天天看點

23模式之: 建造者模式demo

宇宙飛船類及子元件類:

package builder_mode;

/**
 * 本類整合了飛船子元件
 */


/**
 * 宇宙飛船
 */
public class Airship {
    
    
    /**
     * 軌道艙
     */
    private OrbitalModule orbitalModule;
    
    
    /**
     * 發動機
     */
    private Engine engine;
    
    
    /**
     * 逃逸艙
     */
    private EscapeTower escapeTower;
    
    
    /**
     * 發射
     */
    public void launch(){
        engine.ignition();
        orbitalModule.openRest();
    }

    
    /**
     * 故障
     */
    public void fault(){
        escapeTower.popup();
    }
    
    
    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 void openRest(){
        System.out.println("開發休息平台!");
    }
    
    
    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 void ignition(){
        System.out.println("點火!");
    }
    
    
    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 void popup(){
        System.out.println("彈出!");
    }
    
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}      

建構者類型:

package builder_mode;

/**
 * 建構者類型
 */
public interface AirshipBuilder {

    /**
     * 建構發動機
     */
    Engine builderEngine();
    
    /**
     * 建構軌道艙
     */
    OrbitalModule builderOrbitalModule();

    /**
     * 建構逃逸艙
     */
    EscapeTower builderEscapeTower();
    
}      

具體建構者:

package builder_mode;

/**
 * Xxx建構者, 具體建構者, 可以配合工廠模式
 */
public class XxxAirshipBuilder implements AirshipBuilder {

    
    /**
     * 建構Xxx牌發動機
     */
    @Override
    public Engine builderEngine() {
        System.out.println("建構Xxx牌發動機!");
        return new Engine("Xxx牌發動機");
    }

    
    /**
     * 建構Xxx牌軌道艙
     */
    @Override
    public OrbitalModule builderOrbitalModule() {
        System.out.println("建構Xxx牌軌道艙!");
        return new OrbitalModule("Xxx牌軌道艙");
    }

    
    /**
     * 建構Xxx牌逃逸艙
     */
    @Override
    public EscapeTower builderEscapeTower() {
        System.out.println("建構Xxx牌逃逸艙!");
        return new EscapeTower("Xxx牌逃逸艙");
    }

}      

組裝者類型:

package builder_mode;

/**
 * 組裝者類型
 */
public interface AirshipDirector {
    
    /**
     * 組裝宇宙飛船
     */
    Airship directAirShip();
    
}      

具體組裝者:

package builder_mode;

/**
 * Xxx組裝者, 具體組裝者
 */
public class XxxAirshipDirector implements AirshipDirector {

    
    /**
     * 持有具體建構者
     */
    private AirshipBuilder builder;
    
    
    /**
     * 構造器(傳入具體建構者)
     * @param builder
     */
    public XxxAirshipDirector(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;
    }

}      

類圖:

23模式之: 建造者模式demo

測試類:

package builder_mode;

public class Client {

    public static void main(String[] args) {
        //建立XXX組裝者(傳入XXX建構者)
        AirshipDirector director = new XxxAirshipDirector(new XxxAirshipBuilder());
        
        //組裝一個飛船對象出來
        Airship ship = director.directAirShip();
        
        
        //測試功能
        ship.launch();
        ship.fault();
    }
    
}      

執行結果:

建構Xxx牌發動機!
建構Xxx牌軌道艙!
建構Xxx牌逃逸艙!
點火!
開發休息平台!
彈出!