一、建造者模式也叫生成器模式,其定義以下:將一個複雜對象的構建與它的表示分離, 使得一樣的構建過程能夠建立不一樣的表示。java
二、建造者模式通用類圖以下:ide
三、建造者模式有以下4個角色:product產品類、builder抽象建造者、concreteBuilder具體建造者、director導演類。ui
相關代碼以下:this
產品類spa
import java.util.ArrayList; /** * 車輛模型抽象類 * */ public abstract class CarModel { //這個參數是各個基本方法執行的順序 private ArrayList<String> sequence = new ArrayList<>(); //模型是啓動開始跑了 protected abstract void start(); //能發動,還要能停下來,那纔是真本事 protected abstract void stop(); //喇叭會出聲音 protected abstract void alarm(); //引擎發動 protected abstract void engineBoom(); //模型動起來 final public void run() { //循環一遍,誰在前,就先執行誰 for (int i = 0; i < sequence.size(); i++) { String actionName = this.sequence.get(i); if ("start".equalsIgnoreCase(actionName)) { this.start(); } else if ("stop".equalsIgnoreCase(actionName)) { this.stop(); } else if ("alarm".equalsIgnoreCase(actionName)) { this.alarm(); } else if ("engineBoom".equalsIgnoreCase(actionName)) { this.engineBoom(); } } } final public void setSequence(ArrayList sequence) { this.sequence = sequence; } }
/** * 奔馳車模型 * */ public class BenzModel extends CarModel { @Override protected void start() { System.out.println("奔馳車啓動。。。"); } @Override protected void stop() { System.out.println("奔馳車停下。。。"); } @Override protected void alarm() { System.out.println("奔馳車喇叭聲。。。"); } @Override protected void engineBoom() { System.out.println("奔馳車引擎聲。。。"); } }
/** * 寶馬車模型 * */ public class BMWModel extends CarModel { @Override protected void start() { System.out.println("寶馬車啓動。。。"); } @Override protected void stop() { System.out.println("寶馬車停下。。。"); } @Override protected void alarm() { System.out.println("寶馬車喇叭聲。。。"); } @Override protected void engineBoom() { System.out.println("寶馬車引擎聲。。。"); } }
建造者code
import java.util.ArrayList; /** * 抽象汽車組裝者 * */ public abstract class CarBuilder { //建造一個模型,你要給我一個順序要求,就是組裝順序 public abstract void setSequence(ArrayList<String> sequence); //設置完畢順序後,就能夠直接拿到這個車輛模型 public abstract CarModel getCarModel(); }
/** * 奔馳車組裝者 * */ public class BenzBuilder extends CarBuilder { private BenzModel benz = new BenzModel(); @Override public void setSequence(ArrayList<String> sequence) { this.benz.setSequence(sequence); } @Override public CarModel getCarModel() { return this.benz; } }
/** * 寶馬車組裝者 * */ public class BMWBuilder extends CarBuilder { private BMWModel bmw = new BMWModel(); @Override public void setSequence(ArrayList<String> sequence) { this.bmw.setSequence(sequence); } @Override public CarModel getCarModel() { return this.bmw; } }
導演類對象
import java.util.ArrayList; /** * 導演類 * */ public class Director { private ArrayList<String> sequence = new ArrayList<>(); private BenzBuilder benzBuilder = new BenzBuilder(); private BMWBuilder bmwBuilder = new BMWBuilder(); //A類型的奔馳車模型,先start,而後stop,其餘什麼引擎、喇叭一律沒有 public BenzModel getABenzModel() { //清理場景 this.sequence.clear(); //執行順序 this.sequence.add("start"); this.sequence.add("stop"); //按照順序返回一個奔馳車 this.benzBuilder.setSequence(this.sequence); return (BenzModel) this.benzBuilder.getCarModel(); } //B類型的奔馳車模型,先發動引擎,而後啓動,而後中止,沒有喇叭 public BenzModel getBBenzModel() { //清理場景 this.sequence.clear(); //執行順序 this.sequence.add("engineBoom"); this.sequence.add("start"); this.sequence.add("stop"); //按照順序返回一個奔馳車 this.benzBuilder.setSequence(this.sequence); return (BenzModel) this.benzBuilder.getCarModel(); } //C類型的寶馬車模型,先按下喇叭,而後啓動,而後中止 public BMWModel getCBMWModel() { //清理場景 this.sequence.clear(); //執行順序 this.sequence.add("alarm"); this.sequence.add("start"); this.sequence.add("stop"); //按照順序返回一個奔馳車 this.benzBuilder.setSequence(this.sequence); return (BMWModel) this.bmwBuilder.getCarModel(); } //D類型的寶馬車模型只有一個功能,就是跑 public BMWModel getDBMWModel() { //清理場景 this.sequence.clear(); //執行順序 this.sequence.add("start"); //按照順序返回一個奔馳車 this.benzBuilder.setSequence(this.sequence); return (BMWModel) this.bmwBuilder.getCarModel(); } /** * 還有不少其餘模型能夠添加實現 */ }
客戶端blog
/** * 客戶端 * */ public class Client { public static void main(String[] args) { Director director = new Director(); //1萬輛A類型的奔馳車 for(int i = 0; i < 10000; i++) { director.getABenzModel().run(); } //100萬輛B類型的奔馳車 for(int i = 0; i < 1000000; i++) { director.getBBenzModel().run(); } //1000萬輛C類型的寶馬車 for(int i = 0; i < 10000000; i++) { director.getCBMWModel().run(); } } }
四、建造者模式優勢事件
封裝性:
使用建造者模式能夠使客戶端沒必要知道產品內部組成的細節, 如例子中咱們就不須要關心每個具體的模型內部是如何實現的, 產生的對象類型就是CarModel。get
建造者獨立, 容易擴展:
BenzBuilder和BMWBuilder是相互獨立的, 對系統的擴展很是有利。
便於控制細節風險
因爲具體的建造者是獨立的, 所以能夠對建造過程逐步細化, 而不對其餘的模塊產生任何影響。
五、建造者模式使用場景
相同的方法, 不一樣的執行順序, 產生不一樣的事件結果時, 能夠採用建造者模式。
多個部件或零件, 均可以裝配到一個對象中, 可是產生的運行結果又不相同時, 則能夠使用該模式。
六、與工廠模式區別
建造者模式最主要的功能是基本方法的調用順序安排, 也就是這些基本方法已經實現了, 通俗地說就是零件的裝配, 順序不一樣產生的對象也不一樣; 而工廠方法則重點是建立, 建立零件是它的主要職責, 組裝順序則不是它關心的。