建造者模式能夠將一個複雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。這句話理解起來可能有點抽象,簡單來說就是調用相同的創建對象的方法(建造過程)可以創建出不同的對象。
案例說明:我們需要創建機器人-特徵(頭、身體、手、腳),需要根據模型創建出不同類型的機器人;
簡單粗暴-直接上代碼:
步驟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模式的定義:“將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。“好理解點了吧。
建造者模式的好處與缺點:
- 易於拓展。想要建唱歌機器人只要單獨將這個類像跳舞人那樣建好,交給Director(指揮官)就可以了。無需修改原有代碼。符合“開閉原則”。
- 代碼解耦、模塊化、方便維護。產品本身與創建過程解耦,可以使用相同的創建過程得到不同的產品。
- 短板有:使用範圍有限。建造者模式創造出來的產品,其組成部分基本相同。如果產品之間的差異較大,則不適用這個模式。
分析對比:這個建造者模式和工廠模式非常相似;
建造者模式:最主要功能是基本方法的調用順序安排,也就是這些基本方 法已經實現了;
工 廠 方 法 :則重點是創建,你要什麼對象我創造一個對象出來,組裝順序則不是他關心的。
使用場景:建造者模式使用的場景,一是產品類非常的複雜,或者產品類中的調用順序不同產生了不同的效能,這個時 候使用建造者模式是非常合適;
案例分析:開源框架Mybatis中建造者模式的應用
- Mybatis 中用到的建造者模式:SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder等
- Mybatis源碼的例子:XMLConfigBuilder讀取配置文件構建出Configuration對象,然後SqlSessionFactoryBuilder使用Configuration對象作爲參數,構建出SqlSessionFactory對象。
- 分析原因這麼做的原因是Mybatis的初始化工作較複雜,不是一個構造函數就能包括的。所以採用了分層構建方法。例如Mybatis中極其重要的Configuration對象,它龐大且複雜,初始化比較麻煩,所以使用專門的建造者XMLConfigBuilder進行構建。
參考文獻:https://www.cnblogs.com/luohanguo/p/10455745.html