在軟件系統中,有時候面臨着「一個複雜對象」的建立工做,其一般由各個部分的子對象用必定的算法構成;因爲需求的變化,這個複雜對象的各個部分常常面臨着劇烈的變化,可是將它們組合在一塊兒的算法確相對穩定。如何應對這種變化?如何提供一種「封裝機制」來隔離出「複雜對象的各個部分」的變化,從而保持系統中的「穩定構建算法」不隨着需求改變而改變?這就是要說的建造者模式。javascript
建造者模式(Builder pattern),將一個複雜對象的構建層與其表示層相互分離,使得一樣的構建過程能夠採用不一樣的表示。也就是說若是咱們用了建造者模式,那麼用戶就須要指定須要建造的類型就能夠獲得它們,而具體建造的過程和細節就不須要知道了。html
在工廠模式中,對建立的結果都是一個完整的個體,咱們對參見的過程不爲所知,只瞭解建立的結果對象。而在建造者模式中咱們關心的是對象的建立過程,所以咱們一般將建立對象的類模塊化,這樣使被建立的類的每個模塊均可以獲得靈活的運用和高質量的複用。前端
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回調等),主要目的就是職責分離。java
一樣再來一個jQuery的例子:$('<div class= "foo"> bar </div>')
,咱們只須要傳入要生成的HTML字符,而不須要關心具體的HTML對象是如何生產的。jquery
建造者模式主要用於「分步驟構建一個複雜的對象」,在這其中「分步驟」是一個穩定的算法,而複雜對象的各個部分則常常變化,其優勢是:建造者模式的「加工工藝」是暴露的,這樣使得建造者模式更加靈活,而且建造者模式解耦了組裝過程和建立具體部件,使得咱們不用去關心每一個部件是如何組裝的。ajax
這種方式對於總體對象類的拆分無疑增長告終構的複雜性,所以若是對象粒度很小,或者模塊間的複用率很低而且變更不大,咱們最好仍是要建立總體對象。算法
本文是系列文章,能夠相互參考印證,共同進步~編程
網上的帖子大多深淺不一,甚至有些先後矛盾,在下的文章都是學習過程當中的總結,若是發現錯誤,歡迎留言指出~segmentfault
參考:
設計模式之建造者模式
《Javascript 設計模式》 - 張榮銘
PS:歡迎你們關注個人公衆號【前端下午茶】,一塊兒加油吧~設計模式
另外能夠加入「前端下午茶交流羣」微信羣,長按識別下面二維碼便可加我好友,備註加羣,我拉你入羣~