一:使用場景
1)使用到的地方:如果你想創建類似汽車這樣的對象,首先要創建輪子,玻璃,桌椅,發動機,外廓等,這些部件都創建好后,最后創建汽車成品,部件的創建和汽車的組裝過程本身都很復雜的情況,希望把部件的創建和成品的組裝分開來做,這樣把要做的事情分割開來,降低對象實現的復雜度,也降低以后成本的維護,把汽車的部件創建和組裝過程獨立出兩個對應的工廠來做,有點類似建立兩個對應的部件創建工廠和汽車組裝工廠兩個工廠,而工廠只是創建一個成品,并沒有把里面的步驟也獨立出來,應該說Builder模式比工廠模式又進了一步。
2)采用Builder模式后的好處:把一個負責的對象的創建過程分解,把一個對象的創建分成兩個對象來負責創建,代碼更有利于維護,可擴性比較好。
3)采用Builder模式后的壞處:實現起來,對應的接口以及部件的對象的創建比較多,代碼相對來講,比較多了,估計剛開始你會有點暈,這個可以考慮代碼精簡的問題,增加代碼的可讀性。
二:一個實際的例子
汽車的組裝
1)首先創建汽車這個成品對象,包含什么的成員
public class Car implements Serializable{
/**
* 汽車序列號
*/
private static final long serialVersionUID = 1L;
/**汽車輪子*/
private Wheel wheel;
/**汽車發動機*/
private Engine engine;
/**汽車玻璃*/
private Glass glass;
/**汽車座椅*/
private Chair chair;
public Wheel getWheel() {
return wheel;
}
public void setWheel(Wheel wheel) {
this.wheel = wheel;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public Glass getGlass() {
return glass;
}
public void setGlass(Glass glass) {
this.glass = glass;
}
public Chair getChair() {
return chair;
}
public void setChair(Chair chair) {
this.chair = chair;
}
}
2)創建對應汽車零部件
public class Wheel {
public Wheel(){
print("--汽車輪子構建完畢--");
}
}
public class Engine {
public Engine(){
print("--汽車發動機構建完畢--");
}
}
public class Glass {
public Glass(){
print("--汽車玻璃構建完畢--");
}
}
public class Chair {
public Chair(){
print("--汽車座椅構建完畢--");
}
}
3)開始重點了,汽車成品的組裝過程
public interface Builder {
/**組裝汽車輪子*/
public void buildWheel();
/**組裝汽車發動機*/
public void buildEngine();
/**組裝汽車玻璃*/
public void buildGlass();
/**組裝汽車座椅*/
public void buildChair();
/**返回組裝好的汽車*/
public Car getCar();
}
以及實現類
public class CarBuilder implements Builder {
/**汽車成品*/
private Car car;
public CarBuilder(){
car=new Car();
}
/**組裝汽車輪子*/
@Override
public void buildChair() {
car.setChair(new Chair());
}
/**組裝汽車發動機*/
@Override
public void buildEngine() {
car.setEngine(new Engine());
}
/**組裝汽車玻璃*/
@Override
public void buildGlass() {
car.setGlass(new Glass());
}
/**組裝汽車座椅*/
@Override
public void buildWheel() {
car.setWheel(new Wheel());
}
/**返回組裝好的汽車*/
@Override
public Car getCar() {
buildChair();
buildEngine();
buildGlass();
buildWheel();
print("--整個汽車構建完畢--");
return car;
}
}
4)最后汽車創建測試
public static void main(String[] args) {
/**創建汽車組裝*/
Builder carBuilder=new CarBuilder();
Car car=carBuilder.getCar();
}
最后輸出:
--汽車座椅構建完畢--
--汽車發動機構建完畢--
--汽車玻璃構建完畢--
--汽車輪子構建完畢--
--整個汽車構建完畢--
5)體會心得:Builder模式實際的重點就把汽車的組裝過程和零部件的生產分開來實現,零部件的生成主要靠自己的對象來實現,我上面只是在構造函數里創建了,比較簡單,而重點汽車的組裝則交給CarBuilder來實現,最終由builder來先負責零部件的創建,最后返回出成品的汽車。