1. 程式人生 > >Java設計模式學習-建造者模式

Java設計模式學習-建造者模式

建造者模式的本質

  • 分離了物件子元件的單獨構造(由Builder來負責)和裝配(由Director負責)。從而可以構造出複雜的物件。這個模式適用於 : 某個物件的構建過程複雜的情況下使用 。
  • 由於實現了構建和裝配的解耦 。不同的構建器 , 相同的裝配 , 也可以做出不同的物件 。相同的構造器 , 不同的裝配順序也可以做出不同的物件 。 也就是實現了構建演算法 , 裝配演算法的解耦 , 實現了更好的複用 。

 

1), 建立了建立宇宙飛船類 --其中在建立類 發動機類/逃逸倉類/頭等艙類

 

/** 宇宙飛船物件
 * @author 曉電腦
 */
public class Spacecraft {

    public Spacecraft(EngineModule engine, EscapeBinModule escapeBin, FirstClassCabiModule firstClassCabi) {
        Engine = engine;
        EscapeBin = escapeBin;
        FirstClassCabi = firstClassCabi;
    }

    public Spacecraft() {
    }

    //飛船發動機
    private EngineModule Engine;

    //飛船逃逸倉
    private EscapeBinModule EscapeBin;
    //飛船頭等艙
    private FirstClassCabiModule FirstClassCabi;

    public EngineModule getEngine() {
        return Engine;
    }

    public void setEngine(EngineModule engine) {
        Engine = engine;
    }

    public EscapeBinModule getEscapeBin() {
        return EscapeBin;
    }

    public void setEscapeBin(EscapeBinModule escapeBin) {
        EscapeBin = escapeBin;
    }

    public FirstClassCabiModule getFirstClassCabi() {
        return FirstClassCabi;
    }

    public void setFirstClassCabi(FirstClassCabiModule firstClassCabi) {
        FirstClassCabi = firstClassCabi;
    }
}

/**
 * 飛船發動機類
 */
class EngineModule{
    private String Engine;

    public EngineModule(String engine) {
        Engine = engine;
    }

    public String getEngine() {
        return Engine;
    }

    public void setEngine(String engine) {
        Engine = engine;
    }
}

/**
 * 飛船逃逸倉類
 */
class EscapeBinModule{
    private String EscapeBin;

    public EscapeBinModule(String escapeBin) {
        EscapeBin = escapeBin;
    }

    public String getEscapeBin() {
        return EscapeBin;
    }

    public void setEscapeBin(String escapeBin) {
        EscapeBin = escapeBin;
    }
}

/**
 * 頭等艙類
 */
class FirstClassCabiModule{
    private String FirstClassCabi;

    public FirstClassCabiModule(String firstClassCabi) {
        FirstClassCabi = firstClassCabi;
    }

    public String getFirstClassCabi() {
        return FirstClassCabi;
    }

    public void setFirstClassCabi(String firstClassCabi) {
        FirstClassCabi = firstClassCabi;
    }
}

 

2),建立宇宙飛船元件

/**
 * 用於建立飛船的子元件 如發動機類/頭等艙類/逃逸倉類 介面
 */
public interface SpacecraftBuilder {

    EngineModule builderEngine();

    EscapeBinModule builderEscapeBin();

    FirstClassCabiModule builderFirstClassCabi();
}

 

3), 建立宇宙飛船元件實現類

public class XiaoSpacecraftBuilder implements SpacecraftBuilder {

    @Override
    public EngineModule builderEngine() {
        System.out.println("構建發動機");
        return new EngineModule("小發動機構建成功");

    }

    @Override
    public EscapeBinModule builderEscapeBin() {
        System.out.println("構建逃逸倉");
        return new EscapeBinModule("小逃逸倉構建成功");
    }

    @Override
    public FirstClassCabiModule builderFirstClassCabi() {
        System.out.println("構建頭等艙");
        return new FirstClassCabiModule("小頭等艙構建成功");
    }
}

 

4),建立宇宙飛船組裝介面類

/**
 * 組裝宇宙飛船介面
 */
public interface SpacecraftDirector {
    Spacecraft createSpacecraft();
}

 

5),宇宙飛船組裝類實現類

public class xiaoSpacecraftDirector implements SpacecraftDirector {
    private SpacecraftBuilder spacecraftBuilder;

    public xiaoSpacecraftDirector(SpacecraftBuilder spacecraftBuilder) {
        this.spacecraftBuilder=spacecraftBuilder;
    }

    @Override
    public Spacecraft createSpacecraft() {
        //構建發動機
        EngineModule module = spacecraftBuilder.builderEngine();
        //構建逃逸倉
        EscapeBinModule module1 = spacecraftBuilder.builderEscapeBin();
        //構建頭等艙
        FirstClassCabiModule classCabiModule = spacecraftBuilder.builderFirstClassCabi();

        //建立宇宙飛船
        Spacecraft spacecraft = new Spacecraft(module,module1,classCabiModule);

        return spacecraft;
    }
}

 

6),建立test測試的客戶端Cilent如下

/**
 * 測試建立宇宙飛船
 */
public class Client {
    public static void main (String[] args) {
        xiaoSpacecraftDirector director = new xiaoSpacecraftDirector(new XiaoSpacecraftBuilder());
        Spacecraft spacecraft = director.createSpacecraft();
        System.out.println(spacecraft.getEngine().getEngine());
        System.out.println(spacecraft.getEscapeBin().getEscapeBin());
        System.out.println(spacecraft.getFirstClassCabi().getFirstClassCabi());
    }
}

 

執行結果:

   

 

建立者模式類圖如下

 

 

建造者模式在開發中應用場景 :

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