當前位置:
首頁 > 知識 > 創建者模式(Builder)|C 設計模式

創建者模式(Builder)|C 設計模式

創建者模式(Builder)|C 設計模式

今天我們要講講Builder模式,也就是建造者模式,當然也有叫生成器模式的。在現實生活中,我們經常會遇到一些構成比較複雜的物品,比如:電腦,它就是一個複雜的物品,它主要是由CPU、主板、硬碟、顯卡、機箱等組裝而成的。手機當然也是複雜物品,由主板,各種晶元,RAM
和ROM
攝像頭之類的東西組成。但是無論是電腦還是手機,他們的組裝過程是固定的,就拿手機來說,組裝流水線是固定的,不變的,但是把不同的主板和其他組件組裝在一起就會生產出不同型號的手機。那麼在軟體系統中是不是也會存在這樣的對象呢?答案是肯定的。在軟體系統中我們也會遇到類似的複雜對象,並且這個複雜對象的各個部分按照一定的演算法組合在一起,此時該對象的創建工作就可以使用Builder模式了,下面我就來詳細看看這個模式吧。


二、建造者模式的詳細介紹

1、動機(Motivate)

在軟體系統中,有時候面臨著「一個複雜對象」的創建工作,其通常由各個部分的子對象用一定的演算法構成;由於需求的變化,這個複雜對象的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法卻相對穩定。如何應對這種變化?如何提供一種「封裝機制」來隔離出「複雜對象的各個部分」的變化,從而保持系統中的「穩定構建演算法」不隨著需求改變而改變?

2、意圖(Intent)

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

3、結果圖

創建者模式(Builder)|C 設計模式

4、模式的組成

1.
抽象建造者角色(Builder):為創建一個Product對象的各個部件指定抽象介面,以規範產品對象的各個組成成分的建造。一般而言,此角色規定要實現複雜對象的哪些部分的創建,並不涉及具體的對象部件的創建。

2. 具體建造者(ConcreteBuilder)

1)實現Builder的介面以構造和裝配該產品的各個部件。即實現抽象建造者角色Builder的方法。

2)定義並明確它所創建的表示,即針對不同的商業邏輯,具體化複雜對象的各部分的創建

3) 提供一個檢索產品的介面

4) 構造一個使用Builder介面的對象即在指導者的調用下創建產品實例

3.指導者(Director):調用具體建造者角色以創建產品對象的各個部分。指導者並沒有涉及具體產品類的信息,真正擁有具體產品的信息是具體建造者對象。它只負責保證對象各部分完整創建或按某種順序創建。

4.產品角色(Product):建造中的複雜對象。它要包含那些定義組件的類,包括將這些組件裝配成產品的介面。

5 建築者模式的具體實現

現在人們生活水平都提高了,家家都有了家庭轎車,那今天我們就以汽車組裝為例來說明Builder模式的實現。

創建者模式(Builder)|C 設計模式

創建者模式(Builder)|C 設計模式

創建者模式(Builder)|C 設計模式

創建者模式(Builder)|C 設計模式

創建者模式(Builder)|C 設計模式

上面代碼中都有詳細的注釋代碼,這裡就不過多解釋。


三、建造者模式的實現要點

在建造者模式中,指揮者是直接與客戶端打交道的,指揮者將客戶端創建產品的請求劃分為對各個部件的建造請求,再將這些請求委派到具體建造者角色,具體建造者角色是完成具體產品的構建工作的,卻不為客戶所知道。
建造者模式主要用於「分步驟來構建一個複雜的對象」,其中「分步驟」是一個固定的組合過程,而複雜對象的各個部分是經常變化的。
產品不需要抽象類,由於建造模式的創建出來的最終產品可能差異很大,所以不大可能提煉出一個抽象產品類。
在前面文章中介紹的抽象工廠模式解決了「系列產品」的需求變化,而建造者模式解決的是 「產品部分」 的需要變化。
由於建造者隱藏了具體產品的組裝過程,所以要改變一個產品的內部表示,只需要再實現一個具體的建造者就可以了,從而能很好地應對產品組成組件的需求變化。


四、.NET 中建造者模式的實現

在微軟的類庫裡面大量使用了設計模式,如果要想學習設計模式,仔細看看微軟的類庫是很有幫助的。今天的設計模式在FCL裡面也有實現,該類型的名字就是System.Text.StringBuilder(存在mscorlib.dll程序集中),它就是一個建造者模式的實現,從名稱也可以看出來。不過它的實現屬於建造者模式的演化,此時的建造者模式沒有指揮者角色和抽象建造者角色,StringBuilder類即扮演著具體建造者的角色,也同時扮演了指揮者和抽象建造者的角色,StringBuilder類扮演著建造string對象的具體建造者角色,其中的ToString()方法用來返回具體產品給客戶端(相當於上面代碼中GetProduct方法)。其中Append方法用來創建產品的組件(相當於上面代碼中BuildPartA和BuildPartB方法),因為string對象中每個組件都是字元,所以也就不需要指揮者的角色的代碼(指的是Construct方法,用來調用創建每個組件的方法來完成整個產品的組裝),因為string字元串對象中每個組件都是一樣的,都是字元,所以Append方法也充當了指揮者Construct方法的作用。

五、總結

今天就到這裡了,還需要重申的是,學習設計模式不能死學,就像StringBuilder一樣,他和Gof23種設計模式中定義的情形有很大的不同,但是它也是Builder模式,因為它們要解決的問題和使用場景是吻合的。我們寫代碼的時候,不要太居於形式,要看使用的契機和模式是否吻合,根據具體的情況我們的模式也會發生變化。當我們看得越多,寫的越多時候,你的變化就越自然了。



找工作難?那是你沒選對行業!

2017年【中公教育】特別推出2017年就業促進計劃,500萬就業基金助你成為IT達人

詳情請戳:http//www.ujiuye.com/zt/jycj/?wt.bd=bgz

什麼?海量IT學習資料白給你都不要?別想了,加群搶:584539956

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

「js高手之路」html5 canvas系列教程-線形漸變
SpringBoot文檔翻譯系列
出行攻略|國慶假期,與其堵在路上,不如浪在這裡~
要放假了,沒別的,只是想送你點實用的東西!
實例|如何從兩個List中篩選出相同的值

TAG:IT優就業 |