[設計模式] ------ 建造者模式(對比模板模式)

建造者模式

建造者模式,是爲了構建一類具有相同執行順序的但實現不一樣,最後產生不一樣的東西的效果。

舉個例子,比如寫作文。

每次寫作文,我們大致有寫標題,寫開頭,寫內容,寫結尾這些步驟。

public abstract class Builder {

    abstract String 寫標題();

    abstract String 寫開頭();

    abstract String 寫內容();

    abstract String 寫結尾();
}

那比如要寫春遊的文章,那就先實現對應的寫標題,寫開頭,寫內容,寫結尾這些方法

public class 春遊作文 extends Builder {

    @Override
    String 寫標題() {
        return "春遊";
    }

    @Override
    String 寫開頭() {
        return "今天,我們幾個人去春遊。";
    }

    @Override
    String 寫內容() {
        return "我們去了哪裏,看到什麼風景,怎麼怎麼樣。";
    }

    @Override
    String 寫結尾() {
        return "啊!春遊真好!真有意義啊!";
    }
}

再寫個看電影

public class 看電影作文 extends Builder {
    @Override
    String 寫標題() {
        return "看電影";
    }

    @Override
    String 寫開頭() {
        return "今天,我們幾個人一起去看電影。";
    }

    @Override
    String 寫內容() {
        return "去哪個電影院,看什麼電影,有什麼感觸。。。";
    }

    @Override
    String 寫結尾() {
        return "啊!電影真好看,下次還想看!";
    }
}

最後,來個指揮官(也可以理解成一個學生),他有一個方法就是寫作文,只要傳入對應的作文子類,他就能寫出對應的作文(這個真的很像應試教育的感覺,條條框框都準備好了,你只需要把每個條條框框裏面的內容做好就行)。

public class Director {
    public String 寫作文(Builder builder){
        String 標題 = builder.寫標題();
        String 開頭 = builder.寫開頭();
        String 內容 = builder.寫內容();
        String 結尾 = builder.寫結尾();
        return 標題 + "\n" + 開頭 + "\n" + 內容 + "\n" + 結尾;
    }
}

測試一把

public class TestMain {

    public static void main(String[] args) {

        Director director = new Director();
        String 春遊作文 = director.寫作文(new 春遊作文());
        System.out.println(春遊作文);

        System.out.println("===================================");
        System.out.println("============下一篇作文===============");
        System.out.println("====================================");

        String 看電影作文 = director.寫作文(new 看電影作文());
        System.out.println(看電影作文);
    }
}

最終打印結果:

春遊
今天,我們幾個人去春遊。
我們去了哪裏,看到什麼風景,怎麼怎麼樣。
啊!春遊真好!真有意義啊!
===================================
============下一篇作文===============
====================================
看電影
今天,我們幾個人一起去看電影。
去哪個電影院,看什麼電影,有什麼感觸。。。
啊!電影真好看,下次還想看!

建造者模式和模板模式比較

其實我認爲這兩個設計模式都是一個意思,沒必要分開說

雖然網上各種說法,大部分都是硬要把兩個分開討論。
可是討論到最後,還不就是繼承那點東西麼。
比如上面這個例子,如果你把最後那個Director類的方法,放在Builder中,不就是模板模式嗎?

所以,我一般將這兩個認爲是一種設計模式,也可以叫模板建造者模式。

專業點講,通用的分爲以下幾步

1、父類定義一系列方法
2、由父類指定順序方法或新建一個類的順序方法,定義各個方法之間的調用順序。
3、子類繼承父類,並重寫對應的方法。
4、針對不同子類調用順序方法,就會產生不同的效果,但整體執行順序都在控制之內。

好吧,硬要區分的話:

建造者模式,就是第二步用新建一個類的順序方法,方法入參是子類
模板模式,就是上面第二步由父類指定順序方法,子類後面指定調用

總結

希望我們在開發中能隨機應變,無招勝有招。

真正牛逼的開發,是他在coding的時候,明明用了某種設計模式了,但他還沒意識到是哪種模式,他只知道這樣做是最合適的,這種人已經把設計模式融會貫通了。

而那種剛學了一點設計模式就到處想用,到處亂用,以及把精力浪費在區分各個設計模式上的人,相當於只學會了部分招式,還遠遠沒到內功心法的境界。

當然,以上兩種人,都比那種招式也不想練,內功也不會的人要強千百倍。

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