一、對Builder模式解耦“過程”和“部件”的理解:
首先以組裝汽車為例,一部汽車可以由發動機、方向盤、車輪等部件組成,而要把這些部件組裝成一部完整的汽車則需要一個復雜的過程。相同的部件在不同的汽車工廠組裝出來的就成為不一樣的汽車。這就是Builder模式的最原始需求原型
從中我們可以看出,如果我們能夠提供這樣一種服務:客戶只需要提供給我們必要的零件,并告知我們最終要組裝成的汽車類型,由汽車裝配公司負責整個后端的裝配工作-對客戶來說是完全透明的。那么我們將可以實現“部件”和“過程”的解耦。只要我們愿意,相同的部件在我們的手里就可以變成不同的產品
二、Builder模式的各個組成部分:
對Builder模式組成的理解,我們可以從兩個不同的角度來看--客戶和工廠
首先從客戶的角度來看,客戶能夠看到、感受到的只有產品和部件,從工廠的角度來看,他們感興趣的是如何生產這些零件以及如何把這些零件組裝成一個合格的產品。
所以我們可以將Builder模式分成四個組成部分:
·產品:public interface Product
·零件:Public interface Part
·生產零件的過程:public interfact Builder
·組裝零件的過程:public class Director
其中產品、零件都是一個接口,其下面可以有多個實現子類。我們重點關注的“生產零件的過程”和“組裝零件的過程”
同樣類型的產品其“生產零件的過程”不盡相同,所以我們必須將其定義成一個接口,由各個零件的生產廠家去實現具體的過程。如下所示:
public interface Builder {
//創建部件A 比如創建汽車車輪
void buildPartA();
//創建部件B 比如創建汽車方向盤
void buildPartB();
//創建部件C 比如創建汽車發動機
void buildPartC();
//返回最后組裝成品結果 (返回最后裝配好的汽車)
//成品的組裝過程不在這里進行,而是轉移到下面的Director類中進行.
//從而實現了解耦過程和部件
Product getResult();
}
public class ConcreteBuilder implements Builder {
Part partA, partB, partC;
public void buildPartA() {//這里是具體如何構建partA的代碼};
public void buildPartB() {//這里是具體如何構建partB的代碼};
public void buildPartC() {//這里是具體如何構建partB的代碼};
public Product getResult() {
//返回最后組裝成品結果
};
}
OK,既然已經廠家已經知道了如何生產零件了,那么剩下來的事情就是:1). 根據客戶要求去生產這些零件 2). 組裝零件成產品
組裝成品由Director類負責,它負責和具體的Builder類交互,告訴Builder我要生產零件,將Builder類生產好的零件組裝成成品,如下所示:
public class Director {
private Builder builder;
public Director( Builder builder ) {
this.builder = builder;
}
// 將部件partA partB partC最后組成復雜對象
//這里是將車輪、方向盤和發動機組裝成汽車的過程
public void construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
.....
}
}
三、Builer模式的使用:
·創建一個Builer對象: Builder builer = new ConcreteBuiler();
·創建一個Director對象: Director director = new Director(builder);
·調用Director對象構建產品:director.construct();
·返回構建好的產品: Product product = builder.getResult();
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。