設(shè)計(jì)模式 -- 建造者模式 (Builder Pattern)


也稱(chēng)為:生成器模式
定義:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。

建造者模式通用類(lèi)圖:

建造者模式 .png

在建造者模式中通常有四個(gè)角色:
①Product產(chǎn)品類(lèi):通常是實(shí)現(xiàn)了模板方法模式,也就是有模板方法與基本方法。
②Builder抽象建造者:規(guī)范產(chǎn)品的組建,由其子類(lèi)實(shí)現(xiàn)。
③ConcreteBuilder子類(lèi)建造者:實(shí)現(xiàn)抽象建造者的方法,并返回一個(gè)組建好的對(duì)象。
④Director導(dǎo)演類(lèi):起到封裝作用,避免高層模塊深入到建造者內(nèi)部的實(shí)現(xiàn)類(lèi),負(fù)責(zé)安排已有模塊的組建,然后告訴Builder開(kāi)始建造,可以有多個(gè)導(dǎo)演類(lèi)。

問(wèn)題重現(xiàn):
現(xiàn)在需要建造車(chē)輛模型,車(chē)有:?jiǎn)?dòng)(start),停止(stop),喇叭(alarm),引擎啟動(dòng)(engineBoom)四種行為,現(xiàn)在需要根據(jù)用戶需求,自定義這四種行為,并生產(chǎn)對(duì)應(yīng)的車(chē)輛模型。

(1)產(chǎn)品抽象類(lèi)

public abstract class CarModel {
    //記錄自定義車(chē)輛模型的行為順序
   private ArrayList<String> abstractArrayList = new ArrayList<>();
    //車(chē)輛啟動(dòng)行為
   protected abstract void start();
    //車(chē)輛停止行為
   protected abstract void stop();
    //車(chē)輛響喇叭行為
   protected abstract void alarm();
    //車(chē)輛引擎發(fā)動(dòng)行為
   protected abstract void engineBoom();
    //模型方法,啟動(dòng)車(chē)輛
   final public void run(){
    //根據(jù)定義好的行為順序啟動(dòng)汽車(chē)行為
      for (int i = 0; i<abstractArrayList.size();i++){
         if (Objects.equals(abstractArrayList.get(i),"start")){
            this.start();
         }
         if (Objects.equals(abstractArrayList.get(i),"stop")){
            this.stop();
         }
         if (Objects.equals(abstractArrayList.get(i),"alarm")){
            this.alarm();
         }
         if (Objects.equals(abstractArrayList.get(i),"engineBoom")){
            this.engineBoom();
         }
      }
   }
    //在抽象類(lèi)中完成傳遞用戶定義好的順序
   protected void setArrayList(ArrayList arrayList){
      this.abstractArrayList = arrayList;
   }
}

(2)產(chǎn)品實(shí)現(xiàn)類(lèi)

public class BMWCar extends CarModel{
    //子類(lèi)重寫(xiě)基本方法
   @Override
   protected void start() {
      System.out.println("start 開(kāi)始");
   }
   
   @Override
   protected void stop() {
      System.out.println("stop 開(kāi)始");
   }
   
   @Override
   protected void alarm() {
      System.out.println("alarm 開(kāi)始");
   }
   
   @Override
   protected void engineBoom() {
      System.out.println("engineBoom 開(kāi)始");
   }
}

經(jīng)過(guò)上述兩部分,已經(jīng)將產(chǎn)品類(lèi)的模板方法與基本方法完成。

(3)抽象建造者

public abstract class CarBuilder {
   //根據(jù)用戶提供的模塊順序搭建汽車(chē)
   abstract CarModel getCar(ArrayList<String> arrayList);
}

(4)具體的子類(lèi)建造者

public class BMWCarBuilder extends CarBuilder {
   @Override
   CarModel getCar(ArrayList<String> arrayList) {
      BMWCar bmwCar = new BMWCar();
      bmwCar.setArrayList(arrayList);
      return bmwCar;
   }
}

(5)導(dǎo)演類(lèi)

public class Director {
   private  ArrayList<String> abstractArrayList = new ArrayList<>();
   private  BMWCarBuilder bmwCarBuilder = new BMWCarBuilder();
   
   public BMWCar getBMWCar( ){
      //清理集合數(shù)據(jù),防止數(shù)據(jù)混亂
      this.abstractArrayList.clear();
      abstractArrayList.add("start");
      abstractArrayList.add("stop");
      abstractArrayList.add("alarm");
      return (BMWCar) bmwCarBuilder.getCar(abstractArrayList);
   }
   
}
------------output--------------
start 開(kāi)始
stop 開(kāi)始
alarm 開(kāi)始

經(jīng)過(guò)上述代碼,用戶可以在導(dǎo)演類(lèi)中自定義車(chē)輛模型的行為順序,然后建造對(duì)應(yīng)的車(chē)輛模型。

建造者模式的優(yōu)點(diǎn):
①封裝性。
②建造者獨(dú)立,擴(kuò)展方便。
③由于建造者是獨(dú)立的,可以對(duì)建造過(guò)程進(jìn)行細(xì)化,便于控制細(xì)節(jié)風(fēng)險(xiǎn),且不會(huì)對(duì)其他模塊造成影響。

建造者模式的使用場(chǎng)景:
①相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果。
②多個(gè)部件組裝到一個(gè)對(duì)象中,運(yùn)行結(jié)果不同時(shí)。

建造者模式的注意點(diǎn):
建造者模式注重零件類(lèi)型和裝配工藝順序,而不是注重創(chuàng)建對(duì)象;工廠方法模式注重的是部件或?qū)ο蟮膭?chuàng)建,組裝順序并不是它所關(guān)心的。

參考書(shū)籍:設(shè)計(jì)模式之禪 --- 秦小波 著

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容