設計模式-03-建造者模式

        建造者模式能夠將一個複雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。這句話理解起來可能有點抽象,簡單來說就是調用相同的創建對象的方法(建造過程)可以創建出不同的對象。 

 

案例說明:我們需要創建機器人-特徵(頭、身體、手、腳),需要根據模型創建出不同類型的機器人;

簡單粗暴-直接上代碼:

步驟1:先創建一個機器人模型-所有的機器人都應該有這些特徵(有頭,有身體,有手,有腳)

public class Robot {
    private String head;
    private String body;
    private String hand;
    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 getHand() {
        return hand;
    }
    public void setHand(String hand) {
        this.hand = hand;
    }
    public String getFoot() {
        return foot;
    }
    public void setFoot(String foot) {
        this.foot = foot;
    }
}

步驟2:定義一個造機器人的標準(一個把頭、身體、手、腳造出來的標準)

public interface IBuildRobot {
    public void buildHead();
    public void buildBody();
    public void buildHand();
    public void buildFoot();
    public Robot createRobot ();

}

 依次創建各個部位,最後調用createRobot方法就可以返回一個我們想要的機器人。

步驟3:有了機器人的模型和創建標準---我們來實現一個會跳舞的機器人

public class DanceRobotBuilder implements IBuildRobot {
    Robot robot;
    public DanceRobotBuilder(){
        robot = new Robot ();
    }
    @Override
    public void buildHead() {
        robot.setHead("寫入機械舞程序");       
    }
    @Override
    public void buildBody() {
        robot.setBody("鈦合金身體");
    }
    @Override
    public void buildHand() {
        robot.setHand("鈦合金手");      
    }
    @Override
    public void buildFoot() {
        robot.setFoot("鈦合金腳");
    }
    @Override
    public Robot createRobot () {
        return robot;
    }

}

       其實到這裏我們已經完成了建造的過程。那就這麼簡單的建造過程,還搞了一個建造模式嗎?非也!接下來,就是介紹建造者模式的精髓,那就是director(指揮官)。這個director呢,就是來執行我們剛纔的造人動作的。沒錯,精髓就是我們剛纔的造人動作。

步驟4:指揮官調用 -- 創建機器人對象

public class Director {
    public Human createRobotByDirecotr(IBuildRobot ibr){
        ibr.buildBody();
        ibr.buildFoot();
        ibr.buildHand();
        ibr.buildHead(); 
        return ibr.createRobot ();
    }
}

步驟5:客戶端調用 - 獲取產品(跳舞機器人)

public class BuilderTest {
    public static void main(String[] args){
        Director director = new Director();
        Robot robot = director.createRobotByDirecotr(new DanceRobotBuilder ());
        System.out.println(robot.getHead());
        System.out.println(robot.getBody());
        System.out.println(robot.getHand());
        System.out.println(robot.getFoot());
        System.out.println("機器人創建成功,恭喜!");
    } 
}

       現在如果我們想要個會唱歌的機器人,就可以像跳舞機器人那樣建好類(每種機器人一個類)交給Director(指揮官),它就可以給你建出來了。

       最後再來看下Builder模式的定義:“將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。“好理解點了吧。

 

建造者模式的好處與缺點:

  1. 易於拓展。想要建唱歌機器人只要單獨將這個類像跳舞人那樣建好,交給Director(指揮官)就可以了。無需修改原有代碼。符合“開閉原則”。
  2. 代碼解耦、模塊化、方便維護。產品本身與創建過程解耦,可以使用相同的創建過程得到不同的產品。
  3. 短板有:使用範圍有限。建造者模式創造出來的產品,其組成部分基本相同。如果產品之間的差異較大,則不適用這個模式。

 

分析對比:這個建造者模式工廠模式非常相似;

      建造者模式:最主要功能是基本方法的調用順序安排,也就是這些基本方 法已經實現了;
      工 廠 方 法 :則重點是創建,你要什麼對象我創造一個對象出來,組裝順序則不是他關心的。

 

使用場景:建造者模式使用的場景,一是產品類非常的複雜,或者產品類中的調用順序不同產生了不同的效能,這個時 候使用建造者模式是非常合適;

 

案例分析:開源框架Mybatis中建造者模式的應用

  1. Mybatis 中用到的建造者模式:SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder等
  2. Mybatis源碼的例子:XMLConfigBuilder讀取配置文件構建出Configuration對象,然後SqlSessionFactoryBuilder使用Configuration對象作爲參數,構建出SqlSessionFactory對象。
  3. 分析原因這麼做的原因是Mybatis的初始化工作較複雜,不是一個構造函數就能包括的。所以採用了分層構建方法。例如Mybatis中極其重要的Configuration對象,它龐大且複雜,初始化比較麻煩,所以使用專門的建造者XMLConfigBuilder進行構建。

 

 

 

參考文獻:https://www.cnblogs.com/luohanguo/p/10455745.html

 

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