springboot 建造者設計模式
一、什么是建造者模式
建造者模式又叫生成器模式,是一種對象構建模式,可以將復雜對象的建造過程抽象出來,使這個抽象過程的不同實現方法可以構造出不同表現(屬性)的對象。
建造者模式是一步一步創建一個復雜的對象,它允許用戶只通過指定復雜對象的類型和內容就可以構建它們,用戶不需要知道內部的具體構建細節。
二、角色組成
product(產品角色):一個具體的產品對象
builder(抽象建造者):創建一個product對象的各個部件指定的接口(抽象類),(接口和抽象類都可以做抽象層)抽象建造者只需要指定建造一個產品的流程,并不管具體的建造細節。
concreteBuilder(具體建造者):實現接口/抽象類,構建和裝配各個部件。負責具體的建造細節。
director(指揮者):構建一個使用builder接口的對象,它主要用于創建一個復雜的對象,主要有兩個作用:隔離客戶與對象生產的過程,負責控制產品對象的過程。
三、應用場景
盒飯套餐:餐廳有多種菜品,顧客可以選擇不同的菜,服務員按照顧客戶的要求,將這些菜組合起來,最終構建出一個完整的套餐。
蓋房子:需要分多個階段進行,比如準備材料、打地基、蓋圍墻…。建造者模式可以將房屋的建造分解成多個步驟,每個步驟對應一個具體的建造者,最終由包 工頭(指導者)來調用不同的建造者,完成整個房子的建造。
Stream API(Java):將集合類轉為stream流,通過一系列的中間操作和終止操作來生成最終結果。
總的來說是:當創建一個復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。 當構造過程必須允許被構造的對象有不同的表示時。
四、實現
4.1 產品類
public class Phone { private String cpu; private String screen; private String memory; private String mainboard; public Phone(String cpu, String screen, String memory, String mainboard) { this.cpu = cpu; this.screen = screen; this.memory = memory; this.mainboard = mainboard; } public String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public String getScreen() { return screen; } public void setScreen(String screen) { this.screen = screen; } public String getMemory() { return memory; } public void setMemory(String memory) { this.memory = memory; } public String getMainboard() { return mainboard; } public void setMainboard(String mainboard) { this.mainboard = mainboard; } @Override public String toString() { return "Phone{" + "cpu='" + cpu + '\'' + ", screen='" + screen + '\'' + ", memory='" + memory + '\'' + ", mainboard='" + mainboard + '\'' + '}'; } }
4.2 抽象建造者
public interface Builder { void buildBoard(String board); void buildCpu(String cpu); void buildRam(String ram); void buildHardDisk(String hardDisk); Phone createPhone(); }
4.3 具體建造者
public class AsusBuilder implements Builder { private Phone mPhone = new AsusPhone(); @Override public void buildBoard(String board) { mPhone.setBoard(board); } @Override public void buildCpu(String cpu) { mPhone.setCpu(cpu); } @Override public void buildRam(String ram) { mPhone.setRam(ram); } @Override public void buildHardDisk(String hardDisk) { mPhone.setHardDisk(hardDisk); } @Override public Phone createPhone() { return mPhone; } } public class DellBuilder implements Builder { private Phone mPhone = new DellPhone(); @Override public void buildBoard() { mPhone.setBoard("Asus Board"); } @Override public void buildCpu() { mPhone.setCpu("Intel i7-8700K"); } @Override public void buildRam() { mPhone.setRam("16GB DDR4"); } @Override public void buildHardDisk() { mPhone.setHardDisk("1TB SSD"); } @Override public Phone createPhone() { return mPhone; } } public class HPBuilder implements Builder { private Phone mPhone = new HPPhone(); @Override public void buildBoard() { mPhone.setBoard("djkfj"); } @Override public void buildCpu() { mPhone.setCpu("麒麟9000"); } @Override public void buildRam() { mPhone.setRam("kdk22 "); } @Override public void buildHardDisk() { mPhone.setHardDisk("威海"); } @Override public Phone createPhone() { return mPhone; } }
4.4 指揮者
public class Director { private Builder mBuilder; public Director(Builder builder) { this.mBuilder = builder; } public Phone buildPhone(String board, String cpu, String ram, String hardDisk) { mBuilder.buildBoard(board); mBuilder.buildCpu(cpu); mBuilder.buildRam(ram); mBuilder.buildHardDisk(hardDisk); return mBuilder.createPhone(); } }
4.5 測試類
public class Client { public static void main(String[] args) { Builder asusBuilder = new AsusBuilder(); Builder dellBuilder = new DellBuilder(); // 指揮者創建對應的手機 Director director = new Director(asusBuilder); Phone asusPhone = director.buildPhone(); director = new Director(dellBuilder); Phone asusPhone = director.buildPhone(); } }
分析:
可以看到,根據不同的需求,建造者模式可以構造出不同的手機對象。每個手機對象的構建過程都由不同的建造者實現,在構建過程中可定制相應的屬性。最終,因為手機的構建過程和表示分離,所以同樣的構建過程可以創建出不同的表示。
優缺點
建造者模式的優點:
1. 將構建復雜對象的過程封裝起來,簡化了代碼結構和邏輯。
2. 不同的具體構造者可以實現不同的構建流程,使得同樣的構建過程可以創建不同的表示。
3. 指導者類可以根據需要按照特定的順序執行構建流程,從而達到更好的控制和管理對象的構建。
建造者模式的缺點:
1. 添加新的部件需要修改抽象類和具體構造者的代碼。
2. 如果對象的屬性較少,使用建造者模式可能會顯得過于復雜,不如直接使用工廠方法模式或簡單工廠模式。
總之,建造者模式適用于需要創建對象復雜且變化多端的情景,它能夠將對象的構建過程標準化,從而達到代碼重用和簡化的目的
原文鏈接:https://blog.csdn.net/Shine19/article/details/147023802

浙公網安備 33010602011771號