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