簡介 建造者模式(Builder Pattern),也叫生成器模式,屬於創建型模式。它使用多個簡單的對象一步一步構建成一個複雜的對象。它允許你使用相同的創建代碼生成不同類型和形式的對象。 當你希望使用代碼創建不同形式的產品 (例如各種商品和訂單) 時, 一些基本部件不會變,而其組合經常變化的時候,就 ...
簡介
建造者模式(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