C++(設計模式):08---創建型模式之生成器模式(Builder)

創建型模式概述

  • 創建型模式抽象了實例化過程它們幫助一個系統獨立於如何創建、組合和表示它的那些對象。一個類創建型模式使用繼承改變被實例化的類,而一個對象創建型模式將實例化委託給另一個對象
  • 創建型模式通過“對象創建”模式繞開new,來避免對象創建(new)過程中所導致的緊耦合(依賴具體類),從而支持對象創建的穩定。它是接口抽象之後的第一步工作
  • 隨着系統演化得越來越依賴於對象複合而不是類繼承,創建型模式變得更爲重要。當這種情況發生時,重心從對一組固定行爲的硬編碼(hard-coding)轉移爲定義一個較小的基本行爲集,這些行爲可以被組合成任意數目的更復雜的行爲。這樣創建有特定行爲的對象要求的不僅僅是實例化一個類。
  • 在這些模式中有兩個不斷出現的主旋律:
    • 第一,它們都將關於該系統使用哪些具體的類的信息封裝起來
    • 第二,它們隱藏了這些類的實例是如何被創建和放在一起的。整個系統關於這些對象所知道的是由抽象類所定義的接口
    • 因此,創建型模式在什麼被創建,誰創建它, 它是怎樣被創建的,以及何時創建這些方面給予你很大的靈活性。它們允許你用結構和功能差別很大的“產品”對象配置一個系統。配置可以是靜態的(即在編譯時指定),也可以是動態的(在運行時)
  • 有時創建型模式是相互競爭的例如:
    • 在有些情況下Prototype或Abstract Factory 用起來都很好
    • 而在另外一些情況下它們是互補的:Builder可以使用其他模式去實現某個構件的創建。Prototype可以在它的實現中使用Singleton
  • 創建型模式有:

一、Builder意圖

  • 將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示

二、動機

  • 待續

三、適用性

  • 在以下情況使用Builder模式:
    • 當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時
    • 當構造過程必須允許被構造的對象有不同的表示時

四、結構

  • 此模式的結構如下圖所示:

五、參與者

  • Builder:爲創建一個Product對象的各個部件指定抽象接口
  • ConcreteBuilde:
    • 實現Builder的接口以構造和裝配該產品的各個部件。 — 定義並明確它所創建的表示
    • 提供一個檢索產品的接口
  • Director:構造一個使用Builder接口的對象
  • Product:
    • 表示被構造的複雜對象。ConcreteBuilde創建該產品的內部表示並定義它的裝配過程
    • 包含定義組成部件的類,包括將這些部件裝配成最終產品的接口

六、協作

  • 客戶創建Director對象,並用它所想要的Builder對象進行配置
  • 一旦產品部件被生成,導向器就會通知生成器
  • 生成器處理導向器的請求,並將部件添加到該產品中
  • 客戶從生成器中檢索產品

七、效果

  • 這裏是Builder模式的主要效果:

①它使你可以改變一個產品的內部表示

  • Builder對象提供給導向器一個構造產品的抽象 接口。該接口使得生成器可以隱藏這個產品的表示和內部結構。它同時也隱藏了該產品是如 何裝配的。因爲產品是通過抽象接口構造的,你在改變該產品的內部表示時所要做的只是定 義一個新的生成器

②它將構造代碼和表示代碼分開

  • Builder模式通過封裝一個複雜對象的創建和表示方式 提高了對象的模塊性。客戶不需要知道定義產品內部結構的類的所有信息;這些類是不出現在Builder接口中的。每個ConcreteBuilder包含了創建和裝配一個特定產品的所有代碼。這些代碼只需要寫一次;然後不同的Director可以複用它以在相同部件集合的基礎上構作不同的Product

③它使你可對構造過程進行更精細的控制

  • Builder模式與一下子就生成產品的創建型模 式不同,它是在導向者的控制下一步一步構造產品的。僅當該產品完成時導向者才從生成器 中取回它。因此Builder接口相比其他創建型模式能更好的反映產品的構造過程。這使你可以 更精細的控制構建過程,從而能更精細的控制所得產品的內部結構

八、實現

  • 待續

九、相關模式

  • Abstract Factory與Builder相似,因爲它也可以創建複雜對象。主要的區別是Builder模式着重於一步步構造一個複雜對象。而 Abstract Factory着重於多個系列的產品對象 (簡單的或是複雜的)。Builder在最後的一步返回產品,而對於Abstract Factory來說,產品是 立即返回的
  • Composite通常是用Builder生成的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章