一個產(chǎn)品有不同的組成部分,而在程序里面需要把一個產(chǎn)品抽檢出來需要較多的零件進行處理和組裝,使得構(gòu)造一個產(chǎn)品變得非常復(fù)雜,構(gòu)造模式就是使得客戶在不需要知道這么多復(fù)雜的細節(jié),不必關(guān)心產(chǎn)品內(nèi)部細節(jié)。
首先看下構(gòu)造這的類圖

從這個圖可以看出構(gòu)造模式有四個模塊:
- Director(導(dǎo)演角色),調(diào)用具體構(gòu)造者創(chuàng)建產(chǎn)品對象,他是負責(zé)從客戶端傳來指令交給具體干活的類。
- Builder (抽象建造者),沒有具體的業(yè)務(wù)意義,就是抽象出具體構(gòu)造者的方法,簡單說就是為了多態(tài)。
- ConcreteBuilder(具體構(gòu)造者),苦力,實打?qū)嵉陌蚜慵旌?,組裝好
- Product(抽象產(chǎn)品),這里僅僅是一個抽象產(chǎn)品,具體業(yè)務(wù)也行更加復(fù)雜
- ProductXXX(具體產(chǎn)品),對抽象產(chǎn)品的實現(xiàn)
具體的情況也許并非如上圖所示,如果確定系統(tǒng)開發(fā)過程中只有一個產(chǎn)品,那么沒有必要分成這么多抽象,Builder 轉(zhuǎn)化為一個具體構(gòu)造者,直接引入 Product 進行處理也是可以的。
接下來還是來點代碼看看具體構(gòu)造者模式是怎么玩的。
public abstract class Product{
//提供公共部分
}
public class ProductOne extends Product{
//具體第一個產(chǎn)品相關(guān)屬性方法
}
public class ProductOne extends Product{
//具體第二個產(chǎn)品相關(guān)屬性方法
}
上面把產(chǎn)品類進行了設(shè)定,可以在抽象產(chǎn)品中實現(xiàn)一些共用的,再聲明一些抽象方法迫使子類必須實現(xiàn)。接下看下 Builder 這塊。
public interface Builder{
public void buildOne();
public void buildTwo();
public Product retrievePro();
}
publc class ConcreteBuilderOne implements Builder{
private Product product=new ProductOne();
public void buildOne(){
//打造第一個零件
}
public void buildTwo(){
//打造第二個零件
}
public Product retrievePro(){
//組裝出產(chǎn)品2
return product;
}
}
publc class ConcreteBuilderTwo implements Builder{
private Product product=new ProductTwo();
public void buildOne(){
//打造第一個零件
}
public void buildTwo(){
//打造第二個零件
}
public Product retrievePro(){
//組裝出產(chǎn)品2
return product;
}
}
最終導(dǎo)演出來進行組織下具體產(chǎn)品,給客戶端提供友好接口
public class Director{
private Builder builder;
//這里可以結(jié)合工廠模式
public void construct(String type){
if("one".equals(type)){
builder=new ConcreteBuilderOne()
builder.buildOne();
builder.buildTwo();
builder.retrievePro();
}else if("two".equals(type)){
builder=new ConcreteBuilderTwo()
builder.buildOne();
builder.buildTwo();
builder.retrievePro();
}else{
}
}
}
上述也許過于公式化,舉個例子,有個人,姑且叫他東郭先生(還沒有遇到狼)吧,他要蓋房子,于是他找了張三打地基,李四砌墻,王五鋪瓦,最終東郭先生就蓋好了房子,圖例來表示如下

東郭先生就是一個導(dǎo)演的角色,而張三李四王五就是具體的構(gòu)造者角色,東郭將蓋房子這個事分別交給他們?nèi)齻€來完成,最后自己放個炮仗就說自己蓋好房子了。
構(gòu)造者模式是在構(gòu)造比較復(fù)雜對象,并且該對象可以拆分多個,每個拆分也是個對象或組成部分??梢詫Ω鱾€步驟進行依賴,也就是分步驟進行,如蓋房子,先打地基,然后砌墻,最后鋪瓦,這個順序不可錯(導(dǎo)演的功能),因此在一個屬性在被賦值之前必須把另外一個屬性也要賦值這樣的情況,用構(gòu)造者很好使。