建造者模式的定義:將一個複雜對象構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示java
建造者模式,保證了流程的肯定性,而流程內部的實現細節,是可繼承擴展的。從根源上解決了流程不規範的問題。ide
建造者模式通用類圖:ui
在建造者模式中有以下4個角色:this
建造者模式的優勢:spa
建造者模式使用的場景:設計
實現一個建造者模式Demo,類圖以下:3d
/** * @author Lin * @Date 2018/1/5. */ public abstract class CarModel { /** * 這個參數是各個基本方法的執行順序 */ private ArrayList<String> sequences = new ArrayList<>(); /** * 啓動 */ protected abstract void start(); /** * 中止 */ protected abstract void stop(); /** * 按喇叭 */ protected abstract void alarm(); /** * 發動機響聲 */ protected abstract void engineBoom(); /** * 按照不一樣的設定運行 */ final public void run(){ for (String sequence : sequences){ if(sequence.equals("start")){ this.start(); }else if(sequence.equals("stop")){ this.stop(); }else if(sequence.equals("alarm")){ this.alarm(); }else if(sequence.equals("engine")){ this.engineBoom(); } } } final public void setSequences(ArrayList<String> sequences){ this.sequences = sequences; } }
具體產品類實現:code
/** * @author Lin * @Date 2018/1/5. */ 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("奔馳車引擎是這個聲音的...."); } } /** * @author Lin * @Date 2018/1/5. */ 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("寶馬車引擎是這個聲音的...."); } }
抽象建造者:對象
import java.util.ArrayList; /** * @author Lin * @Date 2018/1/5. */ public abstract class CarBuilder { /** * 設計啓動順序 * @param sequences */ public abstract void setSequences(ArrayList<String> sequences); /** * 設置完成後,獲取車輛 * @return */ public abstract CarModel getCarModel(); }
具體建造者實現:blog
import java.util.ArrayList; /** * @author Lin * @Date 2018/1/5. */ public class BenzBuilder extends CarBuilder{ private BenzModel benz = new BenzModel(); @Override public void setSequences(ArrayList<String> sequences) { benz.setSequences(sequences); } @Override public CarModel getCarModel() { return benz; } } import java.util.ArrayList; /** * @author Lin * @Date 2018/1/5. */ public class BMWBuilder extends CarBuilder{ private BMWModel bmw = new BMWModel(); @Override public void setSequences(ArrayList<String> sequences) { bmw.setSequences(sequences); } @Override public CarModel getCarModel() { return bmw; } }
導演類:
import java.util.ArrayList; /** * @author Lin * @Date 2018/1/5. */ public class Client { public static void main(String[] args) { ArrayList<String> benzSequences = new ArrayList<>(); benzSequences.add("engine"); benzSequences.add("start"); benzSequences.add("alarm"); benzSequences.add("stop"); BenzBuilder benzBuilder = new BenzBuilder(); benzBuilder.setSequences(benzSequences); BenzModel benz = (BenzModel) benzBuilder.getCarModel(); benz.run(); ArrayList<String> bmwSequences = new ArrayList<>(); bmwSequences.add("start"); bmwSequences.add("engine"); bmwSequences.add("alarm"); bmwSequences.add("stop"); BMWBuilder bmwBuilder = new BMWBuilder(); bmwBuilder.setSequences(bmwSequences); BMWModel bmw = (BMWModel)bmwBuilder.getCarModel(); bmw.run(); } }
建造者模式的注意事項:
建造者模式關注的是零件類型和裝配工藝(順序),這是它與工廠方法模式最大的不一樣。雖然同爲建立類模式,可是關注重點不同。