設計模式-建造者模式(Builder)
概要
記憶關鍵詞:類和構造分離
定義:將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
分析:
1)當一個類的建構函式引數個數超過4個,而且這些引數有些是可選的引數,考慮使用構造者模式。
2)構建者模式的精髓是將複雜物件的構建過程封裝到構建者裡,使用構建者再去建立物件,即先有構建者後有產品,產品由構建者建立
總體來說,建造者模式適用於需要建立具有複雜結構或多個配置選項的物件,而且希望將構建過程與表示分離的情況。
建造者模式結構圖如下:
一、能解決什麼問題?
二、涉及的角色
1. Product(目標類)
最終要生成的物件,程式碼示例如下:
1 public class Product { 2 ArrayList<String> parts = new ArrayList<>(); 3 4 public void add(String part) { 5 parts.add(part); 6 } 7 8 public void show() { 9 System.out.println(parts); 10 } 11 }
2. Builder(建造者的抽象基類)
承載了複雜物件的構建過程,程式碼示例如下:
1 public abstract class Builder { 2 3 /** 4 * 構建部分A 5 */ 6 public abstract void buildPartA(); 7 8 /** 9 * 構建部分B 10 */ 11 public abstract void buildPartB(); 12 13 /** 14 * 獲取展示結果 15 * 16 * @return 執行結果 17 */ 18 public abstract Product getResult(); 19 }
3. ConcreteBuilder(具體的建造者)
依賴Product類,ConcreteBuilder跟Product屬於組合關係,ConcreteBuilder屬於整體類,Product屬於部分類
程式碼示例如下:
1 public class ConcreteBuilder extends Builder { 2 3 private final Product product = new Product(); 4 5 @Override 6 public void buildPartA() { 7 product.add("構建產品的上半部分"); 8 } 9 10 @Override 11 public void buildPartB() { 12 product.add("構建產品的下半部分"); 13 } 14 15 @Override 16 public Product getResult() { 17 return product; 18 } 19 }
4. Director
決定如何構建最終產品的演算法。控制Builder的生產過程,Director跟Builder屬於組合關係,Director屬於整體類,Builder屬於部分類。
其會包含一個負責組裝的方法void Construct(Builder builder), 在這個方法中透過呼叫builder的方法,就可以設定builder,等設定完成後,就可以透過builder的 getProduct() 方法獲得最終的產品
程式碼示例如下:
1 public class Director { 2 private final Builder builder; 3 4 public Director(Builder builder) { 5 this.builder = builder; 6 } 7 8 public void construct() { 9 builder.buildPartA(); 10 builder.buildPartB(); 11 } 12 }
客戶端呼叫:
1 public class Client { 2 public static void main(String[] args) { 3 4 ConcreteBuilder concreteBuilder = new ConcreteBuilder(); 5 6 //控制Builder的生產過程 7 Director director = new Director(concreteBuilder); 8 director.construct(); 9 10 Product product = concreteBuilder.getResult(); 11 product.show(); 12 } 13 } 14 15 16 //執行結果 17 [構建產品的上半部分, 構建產品的下半部分]
四、使用場景
在Java原始碼裡,建造者模式最典型的體現就是StringBuilder
說明:StringBuilder是Java中的一個用於構建字串的類,它允許在不建立新的物件的情況下,對字串進行可變操作
注意:lombok中的@Builder 註解透過注入一個靜態內部類作為建造者,簡化了建造者模式的使用,減少了樣板程式碼。這種方式在程式碼中使用起來更加簡潔,並且提高了可讀性。
五、建造者模式與簡單工廠模式的區別
區別在於建造者模式多出一個Builder類,使得建立物件的靈活性大大增加,適用於如下場景:
1. 建立一個物件,多個同樣的方法的呼叫順序不同,產生的結果不同
2. 建立一個物件,特別複雜,引數多,而且很多引數都有預設值