設計模式-建造者模式(Builder)

欢乐豆123發表於2024-07-24

設計模式-建造者模式(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. 建立一個物件,特別複雜,引數多,而且很多引數都有預設值

相關文章