1. 程式人生 > >java23種設計模式——五、建造者模式

java23種設計模式——五、建造者模式

原始碼在我的[github](https://github.com/witmy/JavaDesignPattern)和[gitee](https://gitee.com/witmy/JavaDesignPattern)中獲取 # 目錄 [java23種設計模式—— 一、設計模式介紹](https://www.cnblogs.com/codermy/p/13565137.html) [java23種設計模式—— 二、單例模式](https://www.cnblogs.com/codermy/p/13566365.html) [java23種設計模式——三、工廠模式](https://www.cnblogs.com/codermy/p/13569486.html) [java23種設計模式——四、原型模式](https://www.cnblogs.com/codermy/p/13571750.html) [java23種設計模式——五、建造者模式](https://www.cnblogs.com/codermy/p/13575590.html) # 建造者模式 建造者模式(Builder Pattern)使用多個簡單的物件一步一步構建成一個複雜的物件。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。 一句話概括就是建造者模式的目的是為了**分離複雜物件的屬性與建立過程**。 ## 一、介紹 **意圖:** 將一個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。 **主要解決:** 主要解決在軟體系統中,有時候面臨著"一個複雜物件"的建立工作,其通常由各個部分的子物件用一定的演算法構成;由於需求的變化,這個複雜物件的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法卻相對穩定。 **何時使用:** 一些基本部件不會變,而其組合經常變化的時候。 **如何解決:** 將變與不變分離開。 **關鍵程式碼:** 建造者:建立和提供例項,導演:管理建造出來的例項的依賴關係。 **應用例項:** 1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐"。 2、JAVA 中的 StringBuilder。 **優點:** 1、建造者獨立,易擴充套件。 2、便於控制細節風險。 **缺點:** 1、產品必須有共同點,範圍有限制。 2、如內部變化複雜,會有很多的建造類。 **使用場景:** 1、需要生成的物件具有複雜的內部結構,這些產品物件通常包含多個成員屬性。 2、需要生成的物件內部屬性本身相互依賴。 **注意事項:**與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。 以上部分根據[菜鳥教程](https://www.runoob.com/design-pattern/builder-pattern.html)修改 ## 二、實現 我們知道一個電腦生產出來是需要很多部件的,例如cpu,顯示卡,硬碟,螢幕,主機板等等。 新建一個Computer類 ```java /** * @author codermy * @createTime 2020/7/24 */ @Data public class Computer { private String mainBoard;//主機板 private String cpu;//cpu private String ideoCard;//顯示卡 private String hardDisk;//硬碟 private String memorie; //記憶體條 } ``` 在生成一個用於建造電腦工序的類 ```java /** * @author codermy * @createTime 2020/7/24 * 一臺電腦需要完成的工序 */ public interface ComputerBuilder { void buildMainBoard(); void buildCpu(); void buildIdeoCard(); void buildHardDisk(); void buildMemorie(); // 建造結果 Computer build(); } ``` 現在一共可以成產兩種電腦,分別是飛行堡壘 和 拯救者。 飛行堡壘製作工序 ```java /** * @author codermy * @createTime 2020/7/24 * 飛行堡壘6 */ public class ComputerA implements ComputerBuilder { private Computer computer = new Computer(); @Override public void buildMainBoard() { computer.setMainBoard("X550JK"); } @Override public void buildCpu() { computer.setCpu("Intel Core i5"); } @Override public void buildIdeoCard() { computer.setIdeoCard("GTX1060"); } @Override public void buildHardDisk() { computer.setHardDisk("256GB+1TB混合硬碟"); } @Override public void buildMemorie() { computer.setMemorie("DDR4 8GB×1"); } @Override public Computer build() { return computer; } } ``` 拯救者製作工序 ```java /** * @author codermy * @createTime 2020/7/24 * 拯救者 */ public class ComputerB implements ComputerBuilder { private Computer computer = new Computer(); @Override public void buildMainBoard() { computer.setMainBoard("15Isk"); } @Override public void buildCpu() { computer.setCpu("Intel Core i7"); } @Override public void buildIdeoCard() { computer.setIdeoCard("GTX1050Ti"); } @Override public void buildHardDisk() { computer.setHardDisk("256GB+1TB混合硬碟"); } @Override public void buildMemorie() { computer.setMemorie("DDR4 16GB×1"); } @Override public Computer build() { return computer; } } ``` 新建一個指揮者來指揮完成相應的製作流程 ```java public class Conductor { private ComputerBuilder computerBuilder; public void setComputerBuilder(ComputerBuilder computerBuilder){ this.computerBuilder = computerBuilder; } // 指揮建造過程 public Computer make(){ computerBuilder.buildMainBoard(); computerBuilder.buildCpu(); computerBuilder.buildHardDisk(); computerBuilder.buildIdeoCard(); computerBuilder.buildMemorie(); return computerBuilder.build(); } } ``` 客戶要求 ```java /** * @author codermy * @createTime 2020/7/24 * 客戶 */ public class Client { public static void main(String[] args) { // 一個指揮者 Conductor conductor = new Conductor(); // 需要ComputerA 飛行堡壘 ComputerA fxbl = new ComputerA(); // 指揮建造ComputerA conductor.setComputerBuilder(fxbl); // 得到飛行堡壘 Computer computer1= conductor.make(); System.out.println(computer1); // 一個指揮者 Conductor conductor2 = new Conductor(); // 需要ComputerA 拯救者 ComputerB zjz = new ComputerB(); // 指揮建造ComputerB conductor2.setComputerBuilder(zjz); // 得到拯救者 Computer computer2= conductor2.make(); System.out.println(computer2); } } ``` 輸出 ```bash Computer(mainBoard=X550JK, cpu=Intel Core i5, ideoCard=GTX1060, hardDisk=256GB+1TB混合硬碟, memorie=DDR4 8GB×1) Computer(mainBoard=15Isk, cpu=Intel Core i7, ideoCard=GTX1050Ti, hardDisk=256GB+1TB混合硬碟, memorie=DDR4 16GB