設計模式筆記(三)——建造者模式

1. 需求矛盾

l  同一個廚師,可能每次炒的菜味道不同!html

l  但全國各地的肯德基,味道都幾乎一個味???java

思考:算法

1)  爲何我每次吃到的菜,味道都不同?到底菜被什麼控制了?設計模式

2)  爲何肯德基的快餐誰作都一個樣?這些快餐又被什麼控制了?spa

3)  哪一種控制方式更符合設計模式裏提到的原則?符合什麼原則? ——依賴倒轉原則設計

 

2. 是什麼——定義

將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。建造者模式使用多個簡單的對象一步一步構建成一個複雜的對象code

3. 爲何——特色

在軟件系統中,有時候面臨着"一個複雜對象"的建立工做,其一般由各個部分的子對象用必定的算法構成;因爲需求的變化,這個複雜對象的各個部分常常面臨着劇烈的變化,可是將它們組合在一塊兒的算法卻相對穩定,這就須要用到建造者模式。它將一個複雜的構建與其表示相分離,使得一樣的構建過程能夠建立不一樣的表示。htm

4. 何時用——適用性

一些基本部件不會變,而其組合常常變化的時候。對象

5. UML圖

6. 怎麼用——使用方法

需求:blog

畫王八!

6.1  沒有任何原則的初始設計

class Turtle {
    public void paint() {
        System.out.println("頭。。。");
        System.out.println("身體。。。");
        System.out.println("殼。。。");
        System.out.println("腿。。。");
        System.out.println("尾巴。。。");
    }
}

新加需求:畫日本王八!

class JapanTurtle {
    public void paint() {
        System.out.println("頭。。。");
        System.out.println("身體。。。");
        System.out.println("腿,,。,");
        System.out.println("尾巴。。。");
    }
}

哎呀很差,忘了加殼了。。。

class JapanTurtle {
    public void paint() {
        System.out.println("頭。。。");
        System.out.println("身體。。。");
        System.out.println("殼。。。");//忘了,後來加上的
        System.out.println("腿,,。,");
        System.out.println("尾巴。。。");
    }
}

顯然這種方式已經不合理了!

6.2  應用建造者模式

class Turtle {
    public void paint() {
        paintHead();
        paintBody();
        paintShell();
        paintLeg();
        paintTail();
    }

    private void paintTail() {
        System.out.println("尾巴。。。");
    }

    private void paintShell() {
        System.out.println("殼。。。");
    }

    private void paintLeg() {
        System.out.println("腿。。。");
    }

    private void paintBody() {
        System.out.println("身體。。。");
    }

    private void paintHead() {
        System.out.println("頭。。。");
    }
}

這裏的paint方法起到了「指揮者」(Director)的做用,若是王八缺胳膊少腿了(雖然王八也沒胳膊),必定是指揮者的問題,找他就完事了。或者王八進化了,不須要殼了?!找指揮者把殼那一部分去掉就完事了。

7. 建造者模式與抽象工廠模式的對比

抽象工廠模式實現對產品家族的建立,一個產品家族是這樣的一系列產品:具備不一樣分類維度的產品組合,採用抽象工廠模式則是不須要關心構建過程,只關心什麼產品由什麼工廠生產便可。而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是經過組裝零配件而產生一個新產品,二者的區別仍是比較明顯的。  ——https://www.cnblogs.com/ChinaHook/p/7471736.html

我以爲這段說的挺好的。。。(手動滑稽)

其實總結一下就是兩句話:

  • 抽象工廠模式,由於只看接口和對象的所屬羣體,因此要寫一大堆類和接口支撐。。。
  • 建造者模式,全部的組成部分都須要指揮者控制,因此要寫一大堆方法支撐。。。

多的我也總結不出來了,畢竟仍是太菜。。。(手動滑稽) 

相關文章
相關標籤/搜索