設計模式小抄(二) -- 建造者模式

建造者模式

建造者模式(builder)是建立一個複雜對象的建立型模式,將構建複雜對象的過程和它的部件解耦,使得構建過程和部件的表示分離開來。html

UML結構

建造者模式角色:java

  抽象建造者(Builder)角色:給出一個抽象接口,以規範產品對象的各個組成成分的建造。通常而言,此接口獨立應用程序的商業邏輯。模式中直接建立產品對象的是具體建造者(ConcreteBuilder)角色。具體建造者類必須實現這個接口所要求的兩種方法:一種是建造方法(buildPart1和buildPart2),另外一種是返還結構方法(retrieveResult)。通常來講,產品所包含的零件數目與建造方法的數目相符。換言之,有多少 零件,就有多少相應的建造方法。算法

  具體建造者(ConcreteBuilder)角色:擔任這個角色的是與應用程序緊密相關的一些類,它們在應用程序調用下建立產品的實例。這個角色要完成的任務包括:1.實現抽象建造者Builder所聲明的接口,給出一步一步地完成建立產品實例的操做。2.在建造過程完成後,提供產品的實例。bash

  導演者(Director)角色:擔任這個角色的類調用具體建造者角色以建立產品對象。應當指出的是,導演者角色並無產品類的具體知識,真正擁有產品類的具體知識的是具體建造者角色。ui

  產品(Product)角色:產品即是建造中的複雜對象。通常來講,一個系統中會有多於一個的產品類,並且這些產品類並不必定有共同的接口,而徹底能夠是不相關聯的。            this

實例代碼

目錄結構:spa

Porsche

咱們使用建造者模式, 建立一輛 保時捷(Porsche) 來溜達溜達,大致上一輛車主要有如下屬性(簡單列舉了幾個)code

public class Porsche {
    //引擎
    private String engine;
    //氣缸
    private String cylinder;
    //車架
    private String frame;

    // 省略 get/set method
}
複製代碼

Builder

抽象Builder類, 列舉咱們在建立一輛車過程當中,須要安裝哪些部件cdn

public abstract class Builder {
    public abstract void buildEngine(String engine);

    public abstract void buildCylinder(String cylinder);

    public abstract void buildFrame(String frame);

    public abstract Porsche create();
}

複製代碼

PorscheBuilder

具體實現建立的方法,用於建立車輛htm

public class PorscheBuilder extends Builder {

    private Porsche porsche = new Porsche();


    public void buildEngine(String engine) {
        porsche.setEngine(engine);
    }

    public void buildCylinder(String cylinder) {
        porsche.setCylinder(cylinder);
    }

    public void buildFrame(String frame) {
        porsche.setFrame(frame);
    }

    public Porsche create() {
        return porsche;
    }
}
複製代碼

Director

指揮官, 負責建立過程當中的流程編排

public class Director {
    private Builder builder;

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

    public Porsche createPorsche(String engine, String cylinder, String frame) {
        builder.buildEngine(engine);
        builder.buildCylinder(cylinder);
        builder.buildFrame(frame);
        return builder.create();
    }
}
複製代碼

客戶端調用

class create {
    public static void main(String[] args) {
        Builder builder = new PorscheBuilder();
        Director director = new Director(builder);
        //組裝車輛
        director.createPorsche("engine","cylinder","frame");
    }
}
複製代碼

特性

使用場景

  • 當建立複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
  • 相同的方法,不一樣的執行順序,產生不一樣的事件結果時。
  • 多個部件或零件,均可以裝配到一個對象中,可是產生的運行結果又不相同時。
  • 產品類很是複雜,或者產品類中的調用順序不一樣產生了不一樣的效能。
  • 建立一些複雜的對象時,這些對象的內部組成構件間的建造順序是穩定的,可是對象的內部組成構件面臨着複雜的變化。

優缺點

  • 優勢: 使用建造者模式可使客戶端沒必要知道產品內部組成的細節。 具體的建造者類之間是相互獨立的,容易擴展。 因爲具體的建造者是獨立的,所以能夠對建造過程逐步細化,而不對其餘的模塊產生任何影響。
  • 缺點: 產生多餘的Build對象以及Dirextor類。

參考:

哆啦A夢-傳送門 哆啦A夢-傳送門

相關文章
相關標籤/搜索