摘要:如何應對這種變化如何提供一種封裝機制來隔離出復雜對象的各個部分的變化,從而保持系統中的穩定構建算法不隨著需求改變而改變這就是要說的建造者模式。建造者模式,將一個復雜對象的構建層與其表示層相互分離,使得同樣的構建過程可以采用不同的表示。
1. 簡介
在軟件系統中,有時候面臨著“一個復雜對象”的創建工作,其通常由各個部分的子對象用一定的算法構成;由于需求的變化,這個復雜對象的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的算法確相對穩定。如何應對這種變化?如何提供一種“封裝機制”來隔離出“復雜對象的各個部分”的變化,從而保持系統中的“穩定構建算法”不隨著需求改變而改變?這就是要說的建造者模式。
建造者模式(Builder pattern),將一個復雜對象的構建層與其表示層相互分離,使得同樣的構建過程可以采用不同的表示。也就是說如果我們用了建造者模式,那么用戶就需要指定需要建造的類型就可以得到它們,而具體建造的過程和細節就不需要知道了。
在工廠模式中,對創建的結果都是一個完整的個體,我們對參見的過程不為所知,只了解創建的結果對象。而在建造者模式中我們關心的是對象的創建過程,因此我們通常將創建對象的類模塊化,這樣使被創建的類的每一個模塊都可以得到靈活的運用和高質量的復用。
2. 實現const Human = function(param) { this.skill = param && param.skill || "保密" this.hobby = param && param.hobby || "保密" } Human.prototype = { getSkill: function() { return this.skill }, getHobby: function() { return this.hobby } } const Named = function(named) { (function(named, that) { that.wholeName = named if (named.includes(" ")) { that.FirstName = named.slice(0, named.indexOf(" ")) that.SecondeName = named.slice(named.indexOf(" ")) } })(named, this) } const Work = function(work) { (function(work, that) { switch (work) { case "code": that.work = "工程師" that.workDesc = "每天沉迷于編程" break case "UE": that.work = "設計師" that.workDesc = "設計更像一種藝術" break default : that.work = work that.workDesc = "對不起,我們不清楚您所選擇職位的描述" } })(work, this) } Work.prototype.changeWork = function(work) { this.work = work } const Person = function(param, name, work) { // 構造方法,不同模塊使用不同創建過程 const _person = new Human(param) _person.named = new Named(name) _person.work = new Work(work) return _person } const xiaoming = new Person({ skill: "耍帥", hobby: "裝逼" }, "xiao ming", "code") xiaoming.skill // 耍帥 xiaoming.FirstName // xiao xiaoming.work // 工程師
根據建造者的定義,表相即是回調,也就是說獲取數據以后如何顯示和處理取決于回調函數,相應地回調函數在處理數據的時候不需要關注是如何獲取數據的,同樣的例子也可以在jquery的ajax方法里看到,有很多回調函數(比如success, error回調等),主要目的就是職責分離。
同樣再來一個jQuery的例子:$("
建造者模式主要用于“分步驟構建一個復雜的對象”,在這其中“分步驟”是一個穩定的算法,而復雜對象的各個部分則經常變化,其優點是:建造者模式的“加工工藝”是暴露的,這樣使得建造者模式更加靈活,并且建造者模式解耦了組裝過程和創建具體部件,使得我們不用去關心每個部件是如何組裝的。
這種方式對于整體對象類的拆分無疑增加了結構的復雜性,因此如果對象粒度很小,或者模塊間的復用率很低并且變動不大,我們最好還是要創建整體對象。
本文是系列文章,可以相互參考印證,共同進步~
JS 抽象工廠模式
JS 工廠模式
JS 建造者模式
JS 原型模式
JS 單例模式
JS 回調模式
JS 外觀模式
JS 適配器模式
JS 利用高階函數實現函數緩存(備忘模式)
JS 狀態模式
JS 橋接模式
JS 觀察者模式
網上的帖子大多深淺不一,甚至有些前后矛盾,在下的文章都是學習過程中的總結,如果發現錯誤,歡迎留言指出~
參考:
設計模式之建造者模式
《Javascript 設計模式》 - 張榮銘
PS:歡迎大家關注我的公眾號【前端下午茶】,一起加油吧~
另外可以加入「前端下午茶交流群」微信群,長按識別下面二維碼即可加我好友,備注加群,我拉你入群~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92128.html
摘要:即建造者模式可以強制實行一種分步驟進行的建造過程。指導類負責調用適當的建造者來組建產品,指導類一般不與產品類發生依賴關系,與指導類直接交互的是建造者類建造者模式優點建造者模式的封裝性很好。 建造者模式 將一個復雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。主要解決在軟件系統中,有時候面臨著一個復雜對象的創建工作,由于需求的變化,這個復雜對象的某些部分經常面臨著劇烈的變化...
摘要:創建型模式創建型模式是對一個類的實例化過程進行了抽象,把對象的創建和對象的使用進行了分離關于創建型模式,已經接近尾聲了,還剩下建造者模式和原型模式,這一篇說一說建造者模式建造者模式的定義將一個復雜對象的構建與它的表示分離,使得同樣的構建過程 創建型模式 創建型模式是對一個類的實例化過程進行了抽象,把對象的創建和對象的使用進行了分離 關于創建型模式,已經接近尾聲了,還剩下建造者模式和原型...
摘要:參考文章設計模式之建造者模式一什么是建造者模式建造者模式是將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 參考文章:java設計模式之建造者模式 一、什么是建造者模式建造者模式:是將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。工廠類模式提供的是創建單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來創建復合對象,所謂...
摘要:注意事項聲明函數時候處理業務邏輯區分和單例的區別,配合單例實現初始化構造函數大寫字母開頭推薦注意的成本。簡單工廠模式使用一個類通常為單體來生成實例。 @(書籍閱讀)[JavaScript, 設計模式] 常見設計模式 一直對設計模式不太懂,花了一下午加一晚上的時間,好好的看了看各種設計模式,并總結了一下。 設計模式簡介 設計模式概念解讀 設計模式的發展與在JavaScript中的應用 ...
摘要:而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是通過組裝零配件而產生一個新產品。最后通過一個套餐實例,介紹了建造者模式在實例中的基本使用手段。 歷史文章回顧: 設計模式專欄 深入理解單例模式 深入理解工廠模式 歷史優質文章推薦: 分布式系統的經典基礎理論 可能是最漂亮的Spring事務管理詳解 面試中關于Java虛擬機(jvm)的問題看這篇就夠了 無論是在現實世界中還是在軟件...
閱讀 1861·2021-11-15 11:39
閱讀 1226·2021-10-18 13:29
閱讀 1188·2021-08-31 09:42
閱讀 2741·2019-08-30 11:11
閱讀 2117·2019-08-26 12:12
閱讀 2116·2019-08-26 10:17
閱讀 3391·2019-08-23 18:38
閱讀 3228·2019-08-23 18:38