簡介
建造者模式(Builder Pattern),也叫生成器模式,屬于創建型模式,它使用多個簡單的物件一步一步構建成一個復雜的物件,它允許你使用相同的創建代碼生成不同型別和形式的物件,
當你希望使用代碼創建不同形式的產品 (例如各種商品和訂單) 時, 一些基本部件不會變,而其組合經常變化的時候,就可以考慮建造者模式,
作用
- 當需要創建復雜物件的時候,由各個部分的子物件來逐步構建,以適應復雜多變的情況,
- 具體的建造者類之間是相互獨立的,這有利于系統的擴展,
- 將變與不變分離開,主管類隱藏了產品構造細節, 客戶端只需要將一個生成器與主管類關聯,就能從生成器處構造物件,
實作步驟
- 定義主管類,可以制造所有形式的產品,
- 在基本生成器介面中宣告創建產品的步驟,
- 為每個形式的產品創建具體生成器類,并實作其構造步驟,
- 客戶端同時創建生成器和主管類,所有產品都遵循相同的介面,構造結果通過主管類獲取,
UML

代碼
創建建造者介面
// Builder.java 建造者介面,定義基本建造方法 public interface Builder { public void reset(); public void setName(String name); public void setScreen(Integer[] screen); public void setGPU(Integer no); }
具體建造者類,可以多個
// ManualBuilder.java 使用手冊建造者類也實作了建造者介面 public class ManualBuilder implements Builder { private Manual manual; public void reset() { this.manual = new Manual(); } public void setName(String name) { this.manual.setName(name); } public void setScreen(Integer[] screen) { this.manual.setScreen(screen); } public void setGPU(Integer no) { this.manual.setGpuType(no); } public Manual getProduct() { return this.manual; } } // PhoneBuilder.java 手機建造者實作了建造者介面 public class PhoneBuilder implements Builder { private Phone phone; public void reset() { this.phone = new Phone(); } public void setName(String name) { this.phone.setName(name); } public void setScreen(Integer[] screen) { this.phone.setScreen(screen); } public void setGPU(Integer no) { this.phone.setGpuType(no); } public Phone getProduct() { return this.phone; } }
定義具體產品類,不同建造者建造不同產品
// Manual.java 手冊產品類 public class Manual { private String name = "PhoneManualName"; private Integer[] screen = { 0, 0 }; private Integer gpuType = 0; private Integer pages = 0; public void setName(String name) { this.name = name; } public String getName() { return this.name; } public void setScreen(Integer[] screen) { this.screen = screen; } public Integer[] getScreen() { return this.screen; } ...... } // Phone.java 手機產品類 public class Phone { private String name = "PhoneName"; private Integer[] screen = { 0, 0 }; private Integer gpuType = 0; public void setName(String name) { this.name = name; } public String getName() { return this.name; } public void setScreen(Integer[] screen) { this.screen = screen; } public Integer[] getScreen() { return this.screen; } ...... }
指揮調度類
// Director.java 指揮調度類,負責利用建造者建造產品,隔離需求與功能 public class Director { // 建造phone1 public void buildIPhone(Builder builder) { builder.reset(); Integer[] screen = { 120, 500 }; builder.setName("iPhone"); builder.setScreen(screen); builder.setGPU(100); } // 建造phone2 public void buildHuaweiPhone(Builder builder) { builder.reset(); Integer[] screen = { 130, 600 }; builder.setName("HuaweiPhone"); builder.setScreen(screen); builder.setGPU(102); } // 建造phone3 public void buildMiPhone(Builder builder) { builder.reset(); Integer[] screen = { 120, 650 }; builder.setName("MiPhone"); builder.setScreen(screen); builder.setGPU(103); } }
測驗呼叫
/** * 建造者模式是使用多個簡單的物件一步一步構建出一個復雜的物件來, * 分為主管類和建造這類,主管類負責具體指揮調度,建造負責具體實施, * 主管類通過一步一步呼叫各種建造者實作復雜物件, */ // 宣告指揮者 Director director = new Director(); // 創建手機 PhoneBuilder phoneBuilder = new PhoneBuilder(); director.buildMiPhone(phoneBuilder); Phone miPhone = phoneBuilder.getProduct(); System.out.println("miPhone:" + miPhone.getName() + " | " + miPhone.getGpuType().toString()); // 創建手冊 ManualBuilder manualBuilder = new ManualBuilder(); director.buildMiPhone(manualBuilder); Manual manual = manualBuilder.getProduct(); System.out.println("manual:" + manual.getName() + " | " + manual.getGpuType().toString());
更多語言版本
不同語言實作設計模式:https://github.com/microwind/design-pattern
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/546746.html
標籤:設計模式
上一篇:應用程式之間的通信傳輸協議
下一篇:系統性能優化十大絕招
