Builder模式的理解!!

liubing76發表於2003-05-14


Builder
是為了將構建複雜物件的組裝過程和它的建立部件與產品物件分離.注意: 是解耦組裝過程和建立具體部件.
過程實現使用Director,它僅關心組裝部件的過程,不關心每個具體部件的建立。
而Builder則是定義出建立部件的介面,然而具體的建立,則是有ConcreteBuilder
來實現。
由於在Director使用是Builder介面所以,這樣就可以重用建立過程,因為
不同的ConcreteBuilder,雖然建立部件不同相同,但是組裝過程卻相同。


我們假設,每個汽車都有車輪,發動機等部件組成,如果不使用模式,按照一般的方法,
在建構函式中,建立部件車輪,發動機,並且然後進行了組裝。
下面以一輛Polo為例:
public class Polo{
//在建構函式中,建立部件,然後進行組裝
public Polo(){
//建立部件
車輪 obj1=new 車輪();
//進行組裝部件
this.車輪s.add(obj1);

車輪 obj2=new 車輪();
this.車輪s.add(obj2);
//這裡省略其他兩個車輪
.................

汽車發動機 objNessan=new 汽車發動機();
this.汽車發動機=objNessan;

}
//汽車的組成部件
public vector 車輪s=new Vector;

public 汽車發動機 汽車發動機 =null;
//這裡省略了其他部件和功能函式
.................
}
這就是我們沒有使用Builder的方式,這樣使建構函式相當的複雜。
因為它負責建立具體的部件如(4個車輪,和一個發動機),然後需要進行組裝成為產品Polo.
如果我們再增加一種車的型別HongDa,雖然它們種類不同,具體的部件不同,
但是組裝的過程相同和部件的抽象(4個車輪和一個發動機)相同。
這樣違背地OO的思想重用,於是我們把組裝的過程,和建立部件,從產品的構造中獨立出來,
其實就是簡化產品的建構函式,封裝成物件,來重用。
於是我們外部化一個Builder它負責建立汽車部件和組裝過程,因為建立的部件不同,如Polo的車輪和
HongDa的不同,但是它們的組裝過程卻是相同的,於是我們先定義,幾個方法將由它的具體子類實現,
和一個具體的方法,它負責組裝過程。明白的會看出這就是模板方法(Template Method)模式。

//它抽象了建立部件,定義一個骨架方法
public class Builder{
public void builder車輪(int n){};
public void builder發動機(){};

public void director構造過程(){
this.builder車輪(4);
this.builder車輪();
}
}

public class PoloBuilder extends Builder{
private Polo polo=new Polo();
public void builder車輪(int n){
for(int i=0;i<n;i++){
車輪 obj1=new 車輪();
polo.車輪s.add(obj1);
}
}
public void builder發動機(){
汽車發動機 objNessan=new 汽車發動機();
polo.汽車發動機=objNessan;
}
public Polo getProduct(){
return polo;
}
}

其實當builder模式的director角色和builder角色合併得化,它就是template method
模式。抽象方法負責建立部件,具體骨架方法負責組裝過程。這樣具體的builder只需實現抽象
方法。

Builder目前負責建立部件和組裝過程,如果我們把這兩個職責,
再進行劃分處理,單獨一個負責組裝過程,另一個負責建立部件。
因為雖然部件不同,但是過程是相同的。於是抽象出兩個類。

//該類負責建立部件,具體的由子類實現
public class Builder{
public void builder車輪(int n){};
public void builder發動機(){};
}
//該類實現組裝過程
public class Director{
private Builder builder=null;

public class Director(Builder builder){
this.builder=builder;
}

public void 組裝過程(){
builder.builder車輪(4);
builder.builder車輪();
}
}
在Director中使用builder介面,然後按照一定規則進行組裝,大家可以
看出這是針對介面進行程式設計的體現。我們看具體的builder
public class PoloBuilder extends Builder{
private Polo polo=new Polo();
public void builder車輪(int n){
for(int i=0;i<n;i++){
車輪 obj1=new 車輪();
polo.車輪s.add(obj1);
}
}
public void builder發動機(){
汽車發動機 objNessan=new 汽車發動機();
polo.汽車發動機=objNessan;
}
public Polo getProduct(){
return polo;
}
}

客戶端的使用,首先建立具體的builder,然後使用Director
PoloBuilder polobuild=new PoloBuilder();
Director d=new Director(polobuild);
d.組裝過程();
Product p=polobuild.getProduct();

相關文章