面試官都愛問的java模式之建造者模式!!!

開心一刻:

同事妻管嚴,零花錢少的可憐,今天一起打牌他輸了400塊沒錢了。想想也可憐,就請他喫飯,喫飯時他說兄弟借十塊錢吧,買張請柬回去好報帳,我當時就呆了,又TM學會一招。。。

簡言:

建造者模式定義:

將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

如果你需要將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示的意圖時,我們需要一個模式,“建造者模式”,又叫生成器模式,建造者模式可以將一個產品內部表現與產品的生成過程分割,從而可以使一個建造過程生成具有不同的內部表現的產品對象,如果我們用了建造者模式,用戶只需要指定需要建造的類型就可以得到他,具體的建造的過程就不需要知道了。

建造者模式的使用

我們以創建“人”來做案例,頭,身體,左手,右手,左腳,右腳。

所以我們想定義一個抽象的建造人的類,穩定了建造人的過程,通過抽象類,實現特有的抽象方法,保證不遺留建造零件(例如每個左腿)

代碼展示:

創建一個人的實體bean

public class Pen {

    private String head;
    private String body;
    private String armLeft;
    private String armRight;
    private String legLeft;
    private String legRight;

    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 getArmLeft() {
        return armLeft;
    }

    public void setArmLeft(String armLeft) {
        this.armLeft = armLeft;
    }

    public String getArmRight() {
        return armRight;
    }

    public void setArmRight(String armRight) {
        this.armRight = armRight;
    }

    public String getLegLeft() {
        return legLeft;
    }

    public void setLegLeft(String legLeft) {
        this.legLeft = legLeft;
    }

    public String getLegRight() {
        return legRight;
    }

    public void setLegRight(String legRight) {
        this.legRight = legRight;
    }
}

 

創建人的抽象類

public abstract class PersonBuilder {
    private Pen p;

    public PersonBuilder(Pen p) {
        this.p = p;
    }

    public abstract void BuildHead();
    public abstract void BuildBody();
    public abstract void BuildArmLeft();
    public abstract void BuildArmRight();
    public abstract void BuildLegLeft();
    public abstract void BuildLegRight();
}

在建造者模式中還有一個很重要的類,指揮者(Director) 用它來控制建造過程,也用它來隔離用戶與建造過程的關聯。

廢話少說上代碼:

public class PersonDirector {

    private PersonBuilder pb;

    /**
     * 用戶告訴指揮者,我需要建造什麼樣的人
     * */
    public PersonDirector(PersonBuilder pb) {
        this.pb = pb;
    }

    /**
     * 根據用戶的選擇建造人
     * */
    public void CreatePerson(){
        pb.BuildHead();
        pb.BuildBody();
        pb.BuildArmLeft();
        pb.BuildArmRight();
        pb.BuildLegLeft();
        pb.BuildLegRight();
    }
}

我們接下來創建人,一個廋子 和 一個胖子,讓這個廋子和胖子繼承這個抽象類,重寫這些抽象方法。

public class PersonFatBuilder extends PersonBuilder{

    public PersonFatBuilder(Pen p) {
        super(p);
    }

    @Override
    public void BuildHead() {
        System.out.println("創建一個胖的頭-----");
    }

    @Override
    public void BuildBody() {
        System.out.println("創建胖的身體-----");
    }

    @Override
    public void BuildArmLeft() {
        System.out.println("創建胖的左手-----");
    }

    @Override
    public void BuildArmRight() {
        System.out.println("創建胖的右手-----");
    }

    @Override
    public void BuildLegLeft() {
        System.out.println("創建胖的左腿-----");
    }

    @Override
    public void BuildLegRight() {
        System.out.println("創建胖的右腿-----");
    }
}
public class PersonThinBuilder extends PersonBuilder {

    public PersonThinBuilder(Pen p) {
        super(p);
    }

    @Override
    public void BuildHead() {
        System.out.println("創建一個廋的頭-----");
    }

    @Override
    public void BuildBody() {
        System.out.println("創建廋的身體-----");
    }

    @Override
    public void BuildArmLeft() {
        System.out.println("創建廋的左手-----");
    }

    @Override
    public void BuildArmRight() {
        System.out.println("創建廋的右手-----");
    }

    @Override
    public void BuildLegLeft() {
        System.out.println("創建廋的左腿-----");
    }

    @Override
    public void BuildLegRight() {
        System.out.println("創建廋的右腿-----");
    }
}

最後我們實現客戶端的代碼;

    /**
         * 創建一個廋的人
         * */
         Pen p = new Pen();
        PersonThinBuilder personThinBuilder = new PersonThinBuilder(p);
        PersonDirector  personDirector = new PersonDirector(personThinBuilder);
        personDirector.CreatePerson();

        /**
         * 創建一個胖的人
         * */
        Pen pFat = new Pen();
        PersonFatBuilder personFatBuilder = new PersonFatBuilder(pFat);
        PersonDirector  personDirectorFat = new PersonDirector(personFatBuilder);
        personDirectorFat.CreatePerson();

輸出的結果如下:

如果我們需要增加一個高的和矮的人,我們怎麼做?

只需要在加兩個類,來實現PersonBuilder這個抽象類,吼  吼

 

建造者模式分析

                               

  通過這結構圖,來分析一下Builder是什麼?

是爲了創建一個product對象各個部件指定的抽象接口。

ConcreteBuilder是什麼那?

它是具體建造者,實現Builder接口,構造和裝配各個部件,Product當然就是那些具體的產品。

Director是什麼那?

指揮者,它是構建一個使用Builder接口對象,

在什麼時候需要使用建造者模式呢?

它主要用於創建一些複雜的對象,這些對象內部構建間的建造順序通常是穩定的,但建造通常面臨着複雜的變化。

建造者模式是在當前創建複雜對象的算法應該獨立於該對象的組成部分以及他們的裝配方式時適用的模式。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章