1. 程式人生 > >大白話建造者模式(Builder Pattern)

大白話建造者模式(Builder Pattern)

前言

起初打算按照之前的日產系列寫建造者模式。但參考了網上的很多文章,讓我對建造者模式更加的困惑,也害怕自己無法已易懂的方式進行解釋。最後通過Google發現了一篇英文文章Builder,使我茅塞頓開。我自己對這篇文章進行了翻譯,希望對大家理解建造者模式有幫助。

意圖

建造者模式是建立型設計模式,用來逐步建立複雜的物件。使用建造者模式可以使用相同的構造程式碼生成不同型別、不同表示的物件。

問題

想象一個複雜的物件,它需要大量欄位和巢狀物件進行初始化。這種的初始化程式碼一般會隱藏在一個包含大量引數的龐大建構函式中。

比如,我們來建一個房子物件。建造一個簡單的房子需要四面牆、一層地板、一扇門、一對窗戶和一個屋頂。但是如果我們想要一個更大更明亮,並且有後院和其他好東西(比如暖氣系統、管道和電線)的房子,那該怎麼辦呢?

最簡單的解決方案是繼承基本House類並建立一組子類來覆蓋所有引數組合,但是後得到大量的子類。任何新的引數都需要進一步擴充套件這個層次結構。

另一個方法不用派生子類。你可以建立一個包含所有引數的建構函式。這種方法不需要大量的子類,但是存在另外的問題。

在大多數情況下,大部分的引數是不被使用的。這樣呼叫建構函式時會顯得程式碼十分難看。

解決

建造模式建議您從自己的類中提取物件構造程式碼,將其移動到被稱為生成器的獨立物件中。

建造者模式將物件構造組織為一組步驟(建牆、建門等)。在Builder物件上執行一系列步驟就可以建立一個物件。最重要的一點是,您無需呼叫所有的步驟,需要呼叫需要的步驟即可。

當需要構建產品的各種表現形式時,某些步驟可能需要不同的實現。比如,小屋的牆壁可以用木頭建造,但城堡的牆壁需要用石頭建造。
這種場景下,可以建立不同的建造者類來實現相同的建造步驟,不同的型別。接下來就可以使用這些建造不同型別的物件。

例如,第一個建造者用木頭和玻璃建造一切,第二個用石頭和鐵建造一切,第三個用黃金和鑽石建造一切。通過呼叫相同的步驟,你可以從第一個建造者那裡得到一個普通的房子,從第二個建造者那裡得到一個小城堡,從第三個建造者那裡得到一個宮殿。

Director

我們可以進一步的將一系列對建造者步驟的呼叫提取到一個類中,這個類被稱為Director。
Director類只定義了執行構建步驟的順序,而構建器提供了這些步驟的實現。


Direct類不是絕對必要的,我們可以按照特定的順序直接呼叫Builder。但是,Director是放置各種可重用構造方案的好方法。
另外,Director類完全隱藏了產品構造的細節。客戶端只需要將一個Builder和一個Director關聯起來就可以得到構建結果。

結構

  1. Builder介面聲明瞭對所有型別的生成器都通用的產品構造步驟。
  2. Concrete Builders 提供了
    構建步驟的不同實現。
  3. Products是需要產生的物件。不同構造器構建的產品可以屬於不同的類層級結構(繼承)或者介面。
  4. Director類定義了呼叫構造步驟的順序,因此您可以建立和重用產品的特定構造方式。
  5. Client必須將一個Builder物件與Director關聯起來。通常,通過director的建構函式的引數只執行一次。然後,director將該Builder物件用於所有的構造。還有一種方式是將Builder物件傳遞給Director的方法,可以使用不同的生成器。

場景

  • 建造者模式用來拜託過長的建構函式。
  • 建立某些產品的不同表示形式,比如石房和木房。
  • 構造複雜物件,將構造程式碼和業務程式碼分離。

    程式碼

程式碼我沒有粘過來,直接訪問參考文獻裡的底部即可。

參考文獻

https://refactoring.guru/design-patterns/buil