設計模式(26)-----建造者模式
建造者模式(Builder Pattern)使用多個簡單的物件一步一步構建成一個複雜的物件。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
一個 Builder 類會一步一步構造最終的物件。該 Builder 類是獨立於其他物件的。
介紹
意圖:將一個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。
主要解決:主要解決在軟體系統中,有時候面臨著"一個複雜物件"的建立工作,其通常由各個部分的子物件用一定的演算法構成;由於需求的變化,這個複雜物件的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法卻相對穩定。
何時使用:一些基本部件不會變,而其組合經常變化的時候。
如何解決:將變與不變分離開。
關鍵程式碼:建造者:建立和提供例項,導演:管理建造出來的例項的依賴關係。
應用例項: 1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐"。 2、JAVA 中的 StringBuilder。
優點: 1、建造者獨立,易擴充套件。 2、便於控制細節風險。
缺點: 1、產品必須有共同點,範圍有限制。 2、如內部變化複雜,會有很多的建造類。
使用場景: 1、需要生成的物件具有複雜的內部結構。 2、需要生成的物件內部屬性本身相互依賴。
注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。
建造者模式,又稱生成器模式:將一個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。
三個角色:建造者、具體的建造者、監工、使用者(嚴格來說不算)
- 建造者角色:定義生成例項所需要的所有方法;
- 具體的建造者角色:實現生成例項所需要的所有方法,並且定義獲取最終生成例項的方法;
- 監工角色:定義使用建造者角色中的方法來生成例項的方法;
- 使用者:使用建造者模式。
注意:定義中“將一個複雜的構建過程與其表示相分離”,表示並不是由建造者負責一切,而是由監工負責控制(定義)一個複雜的構建過程,由各個不同的建造者分別負責實現構建過程中所用到的所有構建步驟。不然,就無法做到“使得同樣的構建過程可以建立不同的表示”這一目標。
建造者角色
package com.suning.builder.builder1; public abstract class Builder { public abstract void buildPart1(); public abstract void buildPart2(); public abstract void buildPart3(); }
具體的建造者角色
package com.suning.builder.builder1; /** * 此處實現了建造純文字文件的具體建造者。 * 可以考慮再實現一個建造HTML文件、XML文件,或者其它什麼文件的具體建造者。 * 這樣,就可以使得同樣的構建過程可以建立不同的表示 */ public class ConcreteBuilder1 extends Builder { private StringBuffer buffer = new StringBuffer();//假設 buffer.toString() 就是最終生成的產品 @Override public void buildPart1() {//實現構建最終例項需要的所有方法 buffer.append("Builder1 : Part1\n"); } @Override public void buildPart2() { buffer.append("Builder1 : Part2\n"); } @Override public void buildPart3() { buffer.append("Builder1 : Part3\n"); } public String getResult() {//定義獲取最終生成例項的方法 return buffer.toString(); } }
監工者
package com.suning.builder.builder1; public class Director { // 將一個複雜的構建過程與其表示相分離 private Builder builder; // 針對介面程式設計,而不是針對實現程式設計 public Director(Builder builder) { this.builder = builder; } public void setBuilder(Builder builder) { this.builder = builder; } public void construct() { // 控制(定義)一個複雜的構建過程 builder.buildPart1(); for (int i = 0; i < 5; i++) { // 提示:如果想在執行過程中替換構建演算法,可以考慮結合策略模式。 builder.buildPart2(); } builder.buildPart3(); } }
呼叫者:
package com.suning.builder.builder1; /** * * @author 88403097 * @date 2018年11月6日 * @version 10.28版本 * @說明:建造者模式,又稱生成器模式:將一個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。 三個角色:建造者、具體的建造者、監工、使用者(嚴格來說不算) 建造者角色:定義生成例項所需要的所有方法; 具體的建造者角色:實現生成例項所需要的所有方法,並且定義獲取最終生成例項的方法; 監工角色:定義使用建造者角色中的方法來生成例項的方法; 使用者:使用建造者模式 注意:定義中“將一個複雜的構建過程與其表示相分離”,表示並不是由建造者負責一切, 而是由監工負責控制(定義)一個複雜的構建過程,由各個不同的建造者分別負責實現構建過程中所用到的所有構建步驟。 不然,就無法做到“使得同樣的構建過程可以建立不同的表示”這一目標。 */ public class Client { public static void main(String[] args) { ConcreteBuilder1 b1 = new ConcreteBuilder1();// 建造者 Director director = new Director(b1);// 監工 director.construct();// 建造例項(監工負責監督,建造者實際建造) String result = b1.getResult();// 獲取最終生成結果 System.out.printf("the result is :%n%s", result); } }
ff