【設計模式學習筆記】建造者模式
阿新 • • 發佈:2019-01-08
建造者模式,以某種形式組合出物件。它和工廠模式的區別在於是否有組合的概念。建造者模式中有產品物件,建造者物件,監工物件。產品物件是各種各樣的POJO,建造者以某種方式組合產品,監工就比較像工廠,獲取產品組合後的物件。這兩天看了菜鳥上的講解和設技模式之禪。這兩者講的有些不同。菜鳥上是產品物件的組合,而設計模式之禪上則偏向物件內部屬性的組合。
文章目錄
之前在模板方法中說道,公司造車過程中我們能使用鉤子決定是否使用某個部件。現在我們想要生產多種車型,而且沒種車輛能夠自由組合零件。那我們應該怎麼辦呢?
1.1 建立
首先我們應該想到應該要有一個集合去存放我們需要的零部件。所以我們改造一下CarTemplate類。
package builder; import java.util.ArrayList; import java.util.List; /************************************************ *@ClassName : CarTemplateI *@Description : TODO *@Author : NikolaZhang *@Date : 【2018/12/4 21:15】 *@Version : 1.0.0 *************************************************/ public abstract class CarTemplateI { protected List chooses = new ArrayList(); protected abstract void wheel(); protected abstract void light(); protected abstract void alarm(); protected final void run(){ if(chooses.contains("wheel")){ wheel(); } if(chooses.contains("light")){ light(); } if(chooses.contains("alarm")){ alarm(); } } public List getChooses() { return chooses; } public void setChooses(List chooses) { this.chooses = chooses; } }
這樣造其他的車就和上面的程式碼一樣。
1.2 建造者
你需要什麼車,你的車需要什麼零件。統統交給建造者。
package builder;
import java.util.List;
/************************************************
*@ClassName : Builder
*@Description : TODO
*@Author : NikolaZhang
*@Date : 【2018/12/4 21:58】
*@Version : 1.0.0
*************************************************/
public class Builder {
private List list;
public void setChoose(List list){
this.list=list;
}
public CarTemplateI getCarTemplate(CarTemplateI carTemplateI){
carTemplateI.setChooses(list);
return carTemplateI;
}
}
1.3 監工
這個傢伙把每個車型需要的零件定好,就可以吩咐建造者幹活去了。往往這種看著清閒的傢伙,賺錢最多。。。
package builder;
import java.util.ArrayList;
import java.util.List;
/************************************************
*@ClassName : Director
*@Description : TODO
*@Author : NikolaZhang
*@Date : 【2018/12/5 20:39】
*@Version : 1.0.0
*************************************************/
public class Director {
private Builder builder = new Builder();
private List list = new ArrayList();
public CarTemplateI productBWMCar(){
list.clear();
list.add("wheel");
list.add("alarm");
builder.setChoose(list);
return builder.getCarTemplate(new BWMCarImpl());
}
public CarTemplateI productBenzCar(){
list.clear();
list.add("wheel");
list.add("light");
list.add("alarm");
builder.setChoose(list);
return builder.getCarTemplate(new BenzCarImpl());
}
}
1.4 測試
好了我們的客戶來買車了。
package builder;
/************************************************
*@ClassName : Test
*@Description : TODO
*@Author : NikolaZhang
*@Date : 【2018/12/4 22:05】
*@Version : 1.0.0
*************************************************/
public class Test {
public static void main(String[] args) {
Director director = new Director();
director.productBenzCar().run();
director.productBWMCar().run();
}
}
1.5 結果
誒,我寶馬的車燈呢?!
這都是監工乾的好事,使用者是不知道生產寶馬時用了什麼零件。這都靠良心啊。
1.6 UML
參考
【菜鳥教程】http://www.runoob.com/design-pattern/builder-pattern.html
本文原文地址:https://blog.csdn.net/baidu_30325009/article/details/85018285