工廠模式

描述

工廠模式是一種創(chuàng)建型設(shè)計(jì)模式辫秧,也就是說是用來創(chuàng)建對(duì)象實(shí)例的般码。我們通常創(chuàng)建實(shí)例使用的都是new 構(gòu)造函數(shù)的方法妻率,為什么會(huì)使用工廠模式來創(chuàng)建對(duì)象了?事實(shí)上板祝,每一種設(shè)計(jì)模式都是為了解決特定的問題宫静,工廠模式也不例外。工廠模式主要是為了解決類的依賴券时,也就是說我們不需要在每次創(chuàng)建對(duì)象的時(shí)候孤里,都去糾結(jié)它的構(gòu)造函數(shù)是誰(當(dāng)項(xiàng)目中定義的類非常多的時(shí)候),或者說不去關(guān)注它的具體的創(chuàng)建過程橘洞,而是將創(chuàng)建過程封裝在一個(gè)函數(shù)中捌袜,這個(gè)函數(shù)被稱為工廠函數(shù)。

工廠模式的代碼實(shí)現(xiàn)

//用于創(chuàng)建實(shí)例的類
class People {
  constructor(name){
    this.name = name;
  }
  init(){
    console.log('init')
  };
  fn1(){
    console.log('fn1');
  };
  fn2(){
    console.log('fn2')
  }
}
//工廠函數(shù)所在的類
class Creator {
  create(name){
//  通過工廠函數(shù)返回一個(gè)實(shí)例
    return new People(name);
  }
}

從上面的代碼中我們可以看到炸枣,首先定義了一個(gè)People類虏等,然后定義了一個(gè)Creator類弄唧,這個(gè)類中有一個(gè)create函數(shù)返回People類的實(shí)例。這就是一個(gè)簡單的工廠模式霍衫,下面我們使用這個(gè)工廠函數(shù)來創(chuàng)建實(shí)例對(duì)象候引。

let creator = new Creator();
//調(diào)用工廠函數(shù)來創(chuàng)建實(shí)例
let p = creator.create('p1');

p.init();//  init
p.fn1(); // fn1
p.fn2(); // fn2
console.log(p instanceof People)  // true

分析上面的代碼,我們通過工廠函數(shù)creator.create()創(chuàng)建了實(shí)例p,在整個(gè)創(chuàng)建的過程中沒有看到People類敦跌,也就是說具體的創(chuàng)建過程是不可見的澄干,我們只需要關(guān)注創(chuàng)建的結(jié)果。

工廠模式的應(yīng)用場景

  1. 當(dāng)我們不希望使用構(gòu)造函數(shù)來進(jìn)行創(chuàng)建對(duì)象的時(shí)候峰髓,可以使用工廠模式創(chuàng)建對(duì)象

這句話可能有點(diǎn)廢話的感覺傻寂,下面給出幾個(gè)可能存在這樣的場景。比如jQuery中的鏈?zhǔn)秸{(diào)用携兵。$('div')就是使用工廠模式創(chuàng)建的對(duì)象疾掰,正是因?yàn)槭褂玫墓S模式創(chuàng)建的對(duì)象,所以才能夠?qū)崿F(xiàn)鏈?zhǔn)秸{(diào)用徐紧。想象一下如果使用new 構(gòu)造函數(shù)來進(jìn)行調(diào)用

new $('div').css()  這種調(diào)用方法肯定是不可行的静檬。
  1. 當(dāng)項(xiàng)目中類非常多的時(shí)候,我們可以通過工廠模式來創(chuàng)建對(duì)象并级。

// People類
class People {
  constructor(name){
    this.name = name;
  }
  service(){
    console.log('service')
  };

}
//  學(xué)生類
class Student {
  constructor(name){
    this.name = name;
  }
  study(){
    console.log('study')
  };

}
//  Teacher類
class Teacher {
  constructor(name){
    this.name = name;
  }
  teach(){
    console.log('teach')
  };

}
//工廠函數(shù)來創(chuàng)建對(duì)象
class Creator {
  create(role){
    switch (role) {
      case 'people':
        return new People('name');
        break;
      case 'student':
        return new Student('name');
        break;
      case 'teacher':
        return new Teacher('name');
        break;
      default:
        throw new Error('參數(shù)錯(cuò)誤, 可選參數(shù):superAdmin拂檩、admin、user');
    }
    return new People(name);
  }
}

從上面的代碼中嘲碧,我們可以看到有多個(gè)類稻励,People類,學(xué)生類愈涩,教師類望抽。假設(shè)我們一個(gè)項(xiàng)目中有非常多的類,我們每次創(chuàng)建一個(gè)實(shí)例時(shí)都得去找到這個(gè)類履婉,這樣的話可能比較麻煩煤篙。假設(shè)使用工廠模式,通過工廠函數(shù)來創(chuàng)建對(duì)象毁腿,就避免了構(gòu)造函數(shù)的問題辑奈。看下面的具體調(diào)用代碼已烤。

let creator = new Creator();
//調(diào)用工廠函數(shù)來創(chuàng)建實(shí)例
let people = creator.create('people');
people.service();  // service

let student = creator.create('student');
student.study();  // study

let teacher = creator.create('teacher');
teacher.teach();  // teach

我們可以發(fā)現(xiàn)鸠窗,通過工廠函數(shù)我們實(shí)現(xiàn)了People類,Student類和教師類等多個(gè)類的實(shí)例的創(chuàng)建胯究。也就是說 工廠模式可以用來實(shí)現(xiàn)創(chuàng)建多個(gè)類的實(shí)例姨丈。

總結(jié)

  1. 工廠模式是用來創(chuàng)建類的實(shí)例枯怖,它不關(guān)注具體的創(chuàng)建過程扰肌,只關(guān)注創(chuàng)建結(jié)果。
  2. 工廠模式可以用來實(shí)現(xiàn)多個(gè)類的實(shí)例的創(chuàng)建涨颜。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茧球,隨后出現(xiàn)的幾起案子庭瑰,更是在濱河造成了極大的恐慌,老刑警劉巖抢埋,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弹灭,死亡現(xiàn)場離奇詭異,居然都是意外死亡揪垄,警方通過查閱死者的電腦和手機(jī)穷吮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饥努,“玉大人捡鱼,你說我怎么就攤上這事】崂ⅲ” “怎么了驾诈?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溶浴。 經(jīng)常有香客問我乍迄,道長,這世上最難降的妖魔是什么士败? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任闯两,我火速辦了婚禮,結(jié)果婚禮上谅将,老公的妹妹穿的比我還像新娘漾狼。我一直安慰自己,他們只是感情好戏自,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布邦投。 她就那樣靜靜地躺著伤锚,像睡著了一般擅笔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屯援,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天猛们,我揣著相機(jī)與錄音,去河邊找鬼狞洋。 笑死弯淘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吉懊。 我是一名探鬼主播庐橙,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼假勿,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了态鳖?” 一聲冷哼從身側(cè)響起转培,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浆竭,沒想到半個(gè)月后浸须,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邦泄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年删窒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顺囊。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肌索,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出包蓝,到底是詐尸還是另有隱情驶社,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布测萎,位于F島的核電站亡电,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏硅瞧。R本人自食惡果不足惜份乒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腕唧。 院中可真熱鬧或辖,春花似錦、人聲如沸枣接。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽但惶。三九已至耳鸯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膀曾,已是汗流浹背县爬。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留添谊,地道東北人财喳。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耳高。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扎瓶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354