學(xué)習(xí)JavaScript設(shè)計(jì)模式——建造者模式

建造者模式——分即是合

建造者模式: 將一個(gè)復(fù)雜對(duì)象的構(gòu)建層與其表示層相互分離,同樣的構(gòu)造過程可采用不同的表示刁岸。

對(duì)比

  • 工廠模式主要是為了創(chuàng)建對(duì)象實(shí)例或者類簇(抽象工廠),關(guān)心的是最終產(chǎn)出(創(chuàng)建)的是什么

  • 工廠模式不關(guān)心創(chuàng)建的整個(gè)過程,僅僅需要知道最終的創(chuàng)建結(jié)果,通過工廠模式得到的都是對(duì)象實(shí)例或者類簇

  • 建造者模式在創(chuàng)建對(duì)象時(shí)更為復(fù)雜佛猛,雖然目的也是為了創(chuàng)建對(duì)象,但是這個(gè)模式更多關(guān)心的是創(chuàng)建這個(gè)對(duì)象的整個(gè)過程(比如創(chuàng)建一個(gè)人坠狡,我們創(chuàng)建的結(jié)果不僅僅是要得到人的實(shí)例继找,還要關(guān)注創(chuàng)建人的時(shí)候,這個(gè)人應(yīng)該穿什么衣服逃沿,男的還是女的婴渡,興趣愛好都是什么), 所以建造者模式更注重的是創(chuàng)建的的細(xì)節(jié)。

  • 比如在發(fā)布簡(jiǎn)歷的需求中凯亮,我們需要的不僅僅是應(yīng)聘者的一個(gè)實(shí)例边臼,還要在創(chuàng)建過程中注意一下這位應(yīng)聘者都有哪些興趣愛好、他的姓名等信息假消,他所期望的職位是什么柠并,等等,這些細(xì)節(jié)關(guān)注點(diǎn)都需要我們創(chuàng)建富拗。

首先臼予,需要的人類的類,和人類的姓名類啃沪、職位類等(在類里使用閉包粘拾,可以讓這個(gè)閉包既是閉包,又是這個(gè)類的構(gòu)造函數(shù))

  // 創(chuàng)建一位人類
  var 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
    }
  }
  
  // 實(shí)例化姓名類
  var Named = function(name){
      var that = this;
      // 構(gòu)造器
      // 構(gòu)造函數(shù)解析姓名的姓與名
      (function(name, that){
         that.wholeName = name  // 緩存這個(gè)name
         if(name.indexOf(' ')> -1){
           that.firstName = that.wholeName.slice(0, that.wholeName.indexOf(' '));
           that.secondName = that.wholeName.slice(that.wholeName.indexOf(' '))
         }
      })(name, that)
  }
  
  // 實(shí)例化職位類
  var Work = function(work){
    var that = this
    // 構(gòu)造器
    // 構(gòu)造函數(shù)中通過傳入的職位特征來設(shè)置相應(yīng)職位以及描述
    (function(work,that){
      switch(work){
        case 'code':
          that.work = '工程師';
          that.workDescript = '每天沉醉于編程';
          break;
        case 'UI':
        case 'UE':
          that.work = '設(shè)計(jì)師';
          that.workDescript = '設(shè)計(jì)更似一種藝術(shù)';
          break;
        case 'teach':
          that.work = '教師';
          that.workDescript = '分享也是一種快樂';
          break;
        default:
          that.work = work;
          that.workDescript = '對(duì)不起缰雇,我們還不清楚您所選擇職位的相關(guān)描述'入偷;  
      } 
    })(work, that)
  }
  
  // 更換期望的職位
  Work.prototype.changeWork = function(work){
    this.work = work
  }
  
  // 添加更換職位的描述
  Work.prototype.changeDescript = function(setence){
    this.workDescript = setence
  }
  
  • 我們就創(chuàng)建了抽象出來的三個(gè)類——應(yīng)聘者類、姓名解析類與期望職位類

  • 接著就使用創(chuàng)建者模式創(chuàng)建一位應(yīng)聘者械哟,使用建造者類盯串,通過對(duì)這3個(gè)類組合調(diào)用,就可以創(chuàng)建出一個(gè)完整的應(yīng)聘者對(duì)象戒良。
    實(shí)例代碼

 /****
  * 應(yīng)聘者建造者
  * 參數(shù) name: 姓名(全名) 空格分隔姓名
  * 參數(shù) work: 期望職位
  **/
  var Person = function(name, work){
    // 創(chuàng)建應(yīng)聘者緩存對(duì)象
    var _person = new Human();
    // 創(chuàng)建應(yīng)聘者姓名解析對(duì)象
    _person.name = new Named(name);
    // 創(chuàng)建應(yīng)聘者期望職位
    _person.work = new Work(work);
    // 將創(chuàng)建的應(yīng)聘者對(duì)象返回
    return _person;
  }
  • 在上面代碼中 我們分成了三個(gè)部分來創(chuàng)建一位應(yīng)聘者對(duì)象
  • 首先創(chuàng)建一位應(yīng)聘者緩存對(duì)象,緩存對(duì)象需要修飾(添加屬性和方法)
  • 然后我們向緩存對(duì)象添加姓名
  • 最后添加一個(gè)職位冠摄,最終我們就可得到一位完整的應(yīng)聘者

測(cè)試代碼

 var person = new Person('Sun Wukong', 'code');
 
 console.log(person.skill)              // 保密
 console.log(person.name.firstName)     // Sun
 console.log(person.work.work)          // 工程師
 console.log(person.work.workDescript)  // 每一天在編程中度過
 person.work.changeDescript('更改一下職位描述糯崎!')
 console.log(person.work.workDescript)  // 更改一下職位描述!
 

總結(jié)

  • 工廠模式創(chuàng)建出來的是一個(gè)對(duì)象河泳,追求的是創(chuàng)建的結(jié)果沃呢,是一個(gè)實(shí)實(shí)在在的創(chuàng)建結(jié)果(實(shí)例化始終是一個(gè)類的對(duì)象或者單一的繼承(抽象工廠方法))
  • 創(chuàng)建者模式有所不同,不僅可以得到創(chuàng)建的結(jié)果拆挥,也參與了創(chuàng)建的具體過程薄霜,對(duì)于創(chuàng)建的具體實(shí)現(xiàn)的細(xì)節(jié)也參閱了干涉,創(chuàng)建的對(duì)象更復(fù)雜纸兔,這種模式創(chuàng)建的對(duì)象是一個(gè)復(fù)合對(duì)象(很像Java中一些復(fù)合類的實(shí)現(xiàn))

注意

  • 工廠模式創(chuàng)建的結(jié)果都是一個(gè)完整的個(gè)體惰瓜,過程我們并不關(guān)心,只得到創(chuàng)建結(jié)果對(duì)象汉矿。
  • 創(chuàng)建者模式中我們要關(guān)系對(duì)象創(chuàng)建的過程崎坊,通常會(huì)把創(chuàng)建對(duì)象的類模塊化,好處是洲拇,使被創(chuàng)建的類的每一個(gè)模塊都可以得到靈活的運(yùn)用與高質(zhì)量的復(fù)用奈揍,
  • 但是最終需求是要得到一個(gè)完整的個(gè)體,所以在拆分創(chuàng)建的整個(gè)過程赋续,我們還是會(huì)得到一個(gè)統(tǒng)一的結(jié)果
  • 這種方式對(duì)于整體對(duì)象類的拆分無形中增加了結(jié)構(gòu)的復(fù)雜性男翰,因此如果對(duì)象粒度很小,或者模塊間的復(fù)用率很低并且變動(dòng)不大纽乱,我們最好還是要?jiǎng)?chuàng)建整體對(duì)象

這篇文字有點(diǎn)多蛾绎,需要盡力去理解,還要對(duì)照前面的工廠模式來看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迫淹,一起剝皮案震驚了整個(gè)濱河市秘通,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敛熬,老刑警劉巖肺稀,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異应民,居然都是意外死亡话原,警方通過查閱死者的電腦和手機(jī)夕吻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來繁仁,“玉大人涉馅,你說我怎么就攤上這事』剖” “怎么了稚矿?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捻浦。 經(jīng)常有香客問我晤揣,道長(zhǎng),這世上最難降的妖魔是什么朱灿? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任昧识,我火速辦了婚禮,結(jié)果婚禮上盗扒,老公的妹妹穿的比我還像新娘跪楞。我一直安慰自己,他們只是感情好侣灶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布甸祭。 她就那樣靜靜地躺著,像睡著了一般炫隶。 火紅的嫁衣襯著肌膚如雪淋叶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天伪阶,我揣著相機(jī)與錄音煞檩,去河邊找鬼。 笑死栅贴,一個(gè)胖子當(dāng)著我的面吹牛斟湃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檐薯,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凝赛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了坛缕?” 一聲冷哼從身側(cè)響起墓猎,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赚楚,沒想到半個(gè)月后毙沾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宠页,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年左胞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寇仓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烤宙,死狀恐怖遍烦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躺枕,我是刑警寧澤服猪,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站拐云,受9級(jí)特大地震影響蔓姚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慨丐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泄私。 院中可真熱鬧房揭,春花似錦、人聲如沸晌端。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咧纠。三九已至蓬痒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漆羔,已是汗流浹背梧奢。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留演痒,地道東北人亲轨。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鸟顺,于是被迫代替她去往敵國和親惦蚊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 無論是運(yùn)維讯嫂、開發(fā)蹦锋、測(cè)試,還是架構(gòu)師欧芽,數(shù)據(jù)庫技術(shù)是一個(gè)必備加薪神器莉掂,那么,一直說學(xué)習(xí)數(shù)據(jù)庫渐裸、學(xué)MySQL巫湘,到底是要學(xué)...
    Java黎先生閱讀 432評(píng)論 0 1
  • 談到寫作装悲,我先反省一下自己,沒有讀過名著尚氛、沒有上過寫作課的我诀诊,真的可以來論寫作嗎?然后阅嘶,我告訴自己属瓣,雖然沒有正式去...
    心誠事享cao閱讀 232評(píng)論 2 5
  • 從常德到開封,這大概是我最任性的一次旅行了讯柔。 從決定去開封到最終啟程抡蛙,中間只隔了一個(gè)晚上。慶問我想好去哪里旅行了嗎...
    聽書醉閱讀 1,120評(píng)論 1 4