Java設計模式之建造者模式

建造者模式是指將一個複雜的對象的創建過程與它的表示分類,使得同樣的創建過程可以創建出不同的表示。簡單說,就是把創建對象時像搭積木一樣一塊一塊去拼裝對象的屬性。建造者模式適用於創建對象的過程需要具體指定創建順序,且不同的順序會產生不同的結果。
建造者模式包含四個角色:

  • 抽象建造者(IBuilder):IBuilder負責定義複雜對象各部分的創建方法以及創建完成後返回實例的方法;
  • 實際建造者(Builder):Builder負責實現IBuilder定義的方法;
  • 設計者(Director):Director負責設計負責對象的創建順序,只負責設計,具體建造過程交給實際建造者;
  • 產品(Building):包含各種屬性的複雜對象。

下面以建樓爲例:
創建Ibuilder:

public interface IBuilder {

    void buildGround();
    void buildBody();
    void buildRoof();

    Building build();
}

創建Builder:

public class Builder implements IBuilder {

    private Building building = new Building();

    @Override
    public void buildGround() {
        building.setGround("地基");
    }

    @Override
    public void buildBody() {
        building.setBody("樓身");
    }

    @Override
    public void buildRoof() {
        building.setRoof("樓頂");
    }

    @Override
    public Building build() {
        return building;
    }
}

創建設計者:

public class Director {

    private IBuilder builder;

    public Director(IBuilder builder) {
        this.builder = builder;
    }

    public Building direct() {
        builder.buildGround();
        builder.buildBody();
        builder.buildRoof();
        return builder.build();
    }
}

創建複雜對象:

public class Building {

    private String ground;
    private String body;
    private String roof;

    public String getGround() {
        return ground;
    }

    public void setGround(String ground) {
        this.ground = ground;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getRoof() {
        return roof;
    }

    public void setRoof(String roof) {
        this.roof = roof;
    }

    @Override
    public String toString() {
        return "Building{" +
                "ground='" + ground + '\'' +
                ", body='" + body + '\'' +
                ", roof='" + roof + '\'' +
                '}';
    }
}

創建業務類:

public class Test {
    public static void main(String[] args) {
        Director director = new Director(new Builder());
        Building building = director.direct();
        System.out.println(building.toString());
    }
}
Building{ground='地基', body='樓身', roof='樓頂'}

建造者模式中,業務類不需要知道產品創建細節,上述代碼用Builder類實現了具體創建方法,用Director類實現了具體建造順序,如果需要其他創建方法,新增建造者類即可,如果需要其他建造順序,新增設計者類即可,符合開閉原則。

建造者模式VS工廠方法模式VS策略模式

  • 建造者模式和工廠方法模式有相似之處,Ibuilder相當於抽象工廠,Builder相當於具體的工廠實現類,只不過Builder類相對於工廠實現類會顯示指定每個屬性的創建,更側重於創建順序。
  • 工廠方法模式沒法創建具有複雜建造順序的產品,如果創建對象需要指定順序,且能得到不同的結果,則適用於建造者模式。
  • 總之一句話,工廠方法模式強調如何生產一個對象,建造者模式強調建造對象的順序,順序不同,就可能產生不同的對象。
  • 建造者模式與策略模式也十分相似,Ibuilder相當於策略接口,Builder相當於具體的策略實現類,Director相當於選擇策略的人Student類,只不過策略模式的Student類側重的是接收創建的策略類,執行不同的策略行爲,針對的是策略類裏的策略方法,而建造者模式的Director類側重的是接收創建的建造者類,設計不同的建造順序,針對的是產品類裏面的各種屬性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章