天天看點

設計模式(三)-建造者模式

什麼是建造者模式

  • 概念
建造者模式就是将一個複雜的對象的建立和表示分離,使得同樣建構過程可以建立不同的表示!
  • 角色

在這樣的設計模式中,有以下幾個角色:

1、Builder:為建立一個産品對象的各個部件指定抽象接口。

2、ConcreteBuilder:實作Builder的接口以構造和裝配該産品的各個部件,定義并明确它所建立的表示,并提供一個檢索産品的接口。

3、Director:構造一個使用Builder接口的對象,指導建構過程。

4、Product:表示被構造的複雜對象。ConcreteBuilder建立該産品的内部表示并定義它的裝配過程,包含定義組成部件的類,包括将這些部件裝配成最終産品的接口。

舉例

首先建立一個人類

//角色Product:
public class Preson {
    private String head;
    private String body;
    private String foot;

    public String getHead() {
        return head;
    }

    public void setHead(String head) {
        this.head = head;
    }

    public String getBody() {
        return body;
    }

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

    public String getFoot() {
        return foot;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }
}

           

然後寫一個接口。一個定義了造人标準的接口

//角色Builder:
public interface PersonBuild {
    public void buildHead();
    public void buildBody();
    public void buildFoot();
    public Preson buildPreson();

}
           

有各種造部位的方法,最後給個createHuman方法給你傳回一個我們想要造的人。

人的類和造人的标準我們都定義好了。接下來造一個男人。

//角色ConcreteBuilder:
public class ManBuilder implements PersonBuild {
    private  Preson preson;

    public ManBuilder() {
        this.preson = new Preson();
    }

    public void buildHead() {
        preson.setHead("男人的身體");
        System.out.println("建造男人的身體");
    }

    public void buildBody() {
        preson.setBody("男人的頭");
        System.out.println("建造男人的頭");
    }

    public void buildFoot() {
        preson.setHead("男人的腳");
        System.out.println("建造男人的腳");
    }

    public Preson buildPreson() {
        return preson;
    }
}

           

繼承制造的标準接口,然後就是set方法封裝人的部件,最後傳回造好的人。

到這裡我們的人并沒建好,就比如我們制造好了機器的生産步驟但是并沒有啟動它,接下來就是建造過程director,他負責執行剛才的造人動作,代碼如下:

//角色Director:
public class PersonDirector {
    protected Preson constructPerson(PersonBuild personBuild){
        personBuild.buildBody();
        personBuild.buildFoot();
        personBuild.buildHead();
        Preson preson = personBuild.buildPreson();
        return preson;
    }
}

           

這個PersonDirector類,重點在于constructPerson的參數是我們的造人标準的接口。這樣一來,隻要是實作了我們的這個接口的類,就都可以作為參數,我們剛剛不是造了一個男人嗎?那我們如果想造一個女人,這個director也可以啟動這個造人過程,隻要我們把這個女人的ConcreteBuilde先寫好。

測試代碼如下:

public class ProsonText {
    public static void main(String[] args) {
        PersonDirector personDirector = new PersonDirector();
        personDirector.constructPerson(new ManBuilder());
    }
}
           

輸出:

建造男人的頭

建造男人的腳

建造男人的身體

總結

建造者模式在使用過程中可以演化出多種形式:

如果具體的被建造對象隻有一個的話,可以省略抽象的Builder和Director,讓ConcreteBuilder自己扮演指導者和建造者雙重角色,甚至ConcreteBuilder也可以放到Product裡面實作。

建造者模式将很多功能內建到一個類裡,這個類可以創造出比較複雜的東西。是以與工程模式的差別就是:工廠模式關注的是建立單個産品,而建造者模式則關注建立符合對象,多個部分。是以,是選擇工廠模式還是建造者模式,依實際情況而定。