374
技術社區[雲棲]
設計模式之建造者模式與工廠方法模式
建造者模式:
將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
建造者模式結構圖:
產品類(Product):一般是一個較為複雜的對象,也就是說創建對象的過程比較複雜,一般會有比較多的代碼量。在本圖中,產品類是一個具體的類,而非抽象類。實際編程中,產品類可以是由一個抽象類與它的不同實現組成,也可以是由多個抽象類與他們的實現組成。
具體建造者(ConcreteBuilder):實現Builder接口,構造和裝配各個部件。即組建產品和返回組建好的產品。
抽象建造者(Builder):是為創建一個Product對象的各個部件指定的抽象接口。這樣更容易擴展。一般至少會有兩個抽象方法,一個用來建造產品,一個是用來返回產品。
指揮者(Director):構建一個使用Builder接口的對象,負責調用適當的建造者來組建產品,導演類一般不與產品類發生依賴關係,與導演類直接交互的是建造者類。一般來說,導演類被用來封裝程序中易變的部分。
適用性:
1、需要生成的產品對象有複雜的內部結構。
2、需要生成的產品對象的屬性相互依賴,建造者模式可以強迫生成順序。
3、 在對象創建過程中會使用到係統中的一些其它對象,這些對象在產品對象的創建過程中不易得到。
優越性:
- 封裝性
使用建造者模式可以使客戶端不必知道產品內部組成的細節,如例子中我們就不需要關心每一個具體的模型內部是如何實現的,產生的對象類型就是CarModel。
- 建造者獨立,容易擴展
Builder之間是相互獨立的,與其它的Builder無關,對係統的擴展非常有利。
- 便於控製細節風險
模式所建造的最終產品更易於控製:由於具體的建造者是獨立的,因此可以對建造過程逐步細化,而不對其他的模塊產生任何影響。
舉例:
在電腦城裝機總有這樣的經曆。我們到了店裏,先會有一個銷售人員來詢問你希望裝的機器是怎麼樣的配置,他會給你一些建議,最終會形成一張裝機單。和客戶確定了裝機配置以後,他會把這張單字交給提貨的人,由他來準備這些配件,準備完成後交給裝機技術人員。技術人員會把這些配件裝成一個整機交給客戶。
不管是什麼電腦,它總是由CPU、內存、主板、硬盤以及顯卡等部件構成的,並且裝機的過程總是固定的:
把主板固定在機箱中
把CPU安裝到主板上
把內存安裝到主板上
把硬盤連接到主板上
把顯卡安裝到主板上
但是,每台兼容機的部件都各不相同的,有些配置高一點,有些配置低一點,這是變化點。對於裝機技術人員來說,他不需要考慮這些配件從哪裏來的,他隻需要把他們組裝在一起了,這是穩定的裝機流程。要把這種變化的配件和穩定的流程進行分離就需要引入Builder模式。
在這裏:銷售人員就屬於指揮者,提貨人員屬於抽象建造者,而又技術人員屬於具體建造者,最終生產出的電腦就是建造者模式中的產品類了。
與工廠模式的區別:
在之前的博客中,已經介紹過工廠模式,可以看出,建造者模式僅僅隻比工廠模式多了一個“指揮類”的角色。在建造者模式圖中,假如把這個指揮類看做是最終調用的客戶端,那麼圖中剩餘的部分就可以看作是一個簡單的工廠模式了。
與工廠模式相比,建造者模式一般用來創建更為複雜的對象,因為對象的創建過程更為複雜,因此將對象的創建過程獨立出來組成一個新的類——指揮類。也就是說,工廠模式是將對象的全部創建過程封裝在工廠類中,由工廠類向客戶端提供最終的產品;而建造者模式中,建造者類一般隻提供產品類中各個組件的建造,而將具體建造過程交付給導演類。由導演類負責將各個組件按照特定的規則組建為產品,然後將組建好的產品交付給客戶端。
最後更新:2017-04-03 12:55:06
上一篇:
分片(Sharding)的全局ID生成
下一篇:
SQL Server 2008 R2用戶'sa'登錄失敗(錯誤18456)
MillWheel: Fault-Tolerant Stream Processing at Internet Scale
網站備案資料怎麼填寫?有哪些技巧和注意事項?
國家網信辦:正在製定有關數據出境評估辦法
服務鏈路追蹤(Spring Cloud Sleuth)
Eclipse luan(Eclipse4.4)tomcat(無法顯示)插件安裝不了的解決方法
Android工作實踐總結:Aidl 遠程調用(aidl實例總結)
微軟詳解Windows 8“照片”
2013年值得關注的技術型企業有哪些?
萬億級數據洪峰下的分布式消息引擎
Android使用Home鍵後應用程序重啟的問題