<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ?**英文名稱**: Builder Pattern又叫做生成器模式 **定義**:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 ## 建造者的一般模式 ![](https://box.kancloud.cn/2016-06-06_57553408da4db.jpg) Product產品類:實現了模板方法模式,也就是有模板方法和基本方法。 Builder類抽象建造者,規范產品的組件,一般是由子類實現 ConcreteBuilder具體建造者,實現抽象類類定義的 所有方法,并返回一個組建好的對象。 Directoer 導演類負責安排已有的模塊的順序,然后告訴Builder開始建造。 該例子只是為了說明 建造者模式的一般模式,并沒有實際的開發場景,因此,在實際項目開發環境中,應該靈活應用建造者模式。 ~~~ public class BuilderPattern { public static void main(String[] args) { MyDirector director = new MyDirector(); Product p = director.getProduct(); p.mothod(); } } class Product { //該類可以引入模板模式,也可以為普通的類。 protected void mothod(){ System.out.println("我是產品類中的方法...."); } } abstract class ProductBuilder{ //該類為抽象的建造者類。具體實現方法是由子類來完成的。 public abstract Product getProduct(); } class AProductBuilder extends ProductBuilder{ //該類是建造者抽像類的具體實現類。創建出需要的實例。 private Product p = new Product(); @Override public Product getProduct() { // TODO Auto-generated method stub return this.p; } } class MyDirector{ //該類是指揮者類,主要用與高速創建者類需要創建的對象。 private AProductBuilder apBuilder = new AProductBuilder(); public Product getProduct(){ return this.apBuilder.getProduct(); } } ~~~ **一個例子**: 建造一個生產汽車的模板,具有start(),stop(),alarm(),engineBoom(),run()等方法。 但是現在的需求是,根據用戶的要求來生產不同類型的車模。例如,寶馬車的模型,按照用戶的需求來啟動寶馬車。 ![](https://box.kancloud.cn/2016-06-06_57553408f2d97.jpg) ~~~ public class BuilderTest { public static void main(String[] args) { //使用指揮者,直接構建模板類型的實例 Director director = new Director(); //獲取奔馳車實例 BenzModel benz = (BenzModel) director.getA_BenzCarModel(); benz.run(); } } class Director{ private ArrayList<String> sequence = new ArrayList<String>(); private BenzBuilder benzBuilder = new BenzBuilder(); private BMWBuilder bmwBuilder = new BMWBuilder(); /** * 寶馬車A的模型 * @return 寶馬車的實例 */ public Model getA_BMWCarModel(){ //先將集合中的數據清空 this.sequence.clear(); //為用戶定義寶馬車的啟動方式 sequence.add("start"); sequence.add("alarm"); sequence.add("stop"); this.bmwBuilder.setSequence(sequence); return this.bmwBuilder.getModel(); } /** * 寶馬車B的模型 * @return 寶馬車B的實例 */ public Model getB_BMWCarModel(){ //先將集合中的數據清空 this.sequence.clear(); //為用戶定義寶馬車的啟動方式 sequence.add("start"); sequence.add("alarm"); sequence.add("engine boom"); sequence.add("stop"); this.bmwBuilder.setSequence(sequence); return this.bmwBuilder.getModel(); } /** * 奔馳車A的模型 * @return 奔馳車的實例 */ public Model getA_BenzCarModel(){ //先將集合中的數據清空 this.sequence.clear(); //為用戶定義寶馬車的啟動方式 sequence.add("start"); sequence.add("alarm"); sequence.add("engine boom"); sequence.add("stop"); this.benzBuilder.setSequence(sequence); return this.benzBuilder.getModel(); } /** * 奔馳車B的模型 * @return 奔馳車的實例 */ public Model getB_BenzCarModel(){ //先將集合中的數據清空 this.sequence.clear(); //為用戶定義寶馬車的啟動方式 sequence.add("start"); sequence.add("alarm"); sequence.add("engine boom"); sequence.add("stop"); this.benzBuilder.setSequence(sequence); return this.benzBuilder.getModel(); } } abstract class Model{ ArrayList<String> sequence = new ArrayList<String>(); //車輛啟動 protected abstract void start(); //車輛停止 protected abstract void stop(); //車輛鳴笛 protected abstract void alarm(); //車輛發動機轟鳴 protected abstract void engineBoom(); protected void run(){ Iterator<String> it = sequence.iterator(); while(it.hasNext()){ String str = it.next(); if(str.equalsIgnoreCase("engine boom")){ this.engineBoom(); }else if(str.equalsIgnoreCase("start")){ this.start(); }else if(str.equalsIgnoreCase("alarm")){ this.alarm(); }else{ this.stop(); } } } protected void setSequence(ArrayList<String> sequence){ this.sequence = sequence; } } class BMWModel extends Model{ @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("寶馬車發動機轟鳴..."); } } class BenzModel extends Model{ @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("奔馳發動機轟鳴..."); } } abstract class CarBuilder{ //用戶自定義車輛啟動方式 protected abstract void setSequence(ArrayList<String> sequence); //返回Model類及其子類的實例 protected abstract Model getModel(); } class BenzBuilder extends CarBuilder{ private Model benz = new BenzModel(); @Override protected void setSequence(ArrayList<String> sequence) { this.benz.setSequence(sequence); } @Override protected Model getModel() { // TODO Auto-generated method stub return this.benz; } } class BMWBuilder extends CarBuilder{ private Model bmw = new BMWModel(); @Override protected void setSequence(ArrayList<String> sequence) { // TODO Auto-generated method stub this.bmw.setSequence(sequence); } @Override protected Model getModel() { // TODO Auto-generated method stub return this.bmw; } } ~~~ **Tip:(開發中的小習慣)** 1、this調用當調用本類中的成員變量或方法時,要使用this關鍵字,以區分本方法中的一個變量 2、super調用,當調用父類的成員變量和方法時,使用super關鍵字 3、當ArrayList和HashMap如果定義成類的成員變量,那在方法中的調用一定要做一個clear的動作,以防止數據混亂 ## 建造者模式使用場景 1、相同的方法,不同的執行順序,產生不同的事件結果時,可以采用建造者模式 2、多個部件和零件,都可以裝配到一個對象中,到那時產生的運行結果又不相同時,這可以使用該模式 3、產品類十分復雜,或者產品類中的調用順序不同產生了不同的效能,使用建造者模式
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看