成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說你對工廠模式的理解?應(yīng)用場景?

開發(fā) 前端
工廠模式是用來創(chuàng)建對象的一種最常用的設(shè)計模式,不暴露創(chuàng)建對象的具體邏輯,而是將將邏輯封裝在一個函數(shù)中,那么這個函數(shù)就可以被視為一個工廠。

[[432996]]

一、是什么

工廠模式是用來創(chuàng)建對象的一種最常用的設(shè)計模式,不暴露創(chuàng)建對象的具體邏輯,而是將將邏輯封裝在一個函數(shù)中,那么這個函數(shù)就可以被視為一個工廠

其就像工廠一樣重復(fù)的產(chǎn)生類似的產(chǎn)品,工廠模式只需要我們傳入正確的參數(shù),就能生產(chǎn)類似的產(chǎn)品

舉個例子:

  • 編程中,在一個 A 類中通過 new 的方式實(shí)例化了類 B,那么 A 類和 B 類之間就存在關(guān)聯(lián)(耦合)
  • 后期因?yàn)樾枰薷牧?B 類的代碼和使用方式,比如構(gòu)造函數(shù)中傳入?yún)?shù),那么 A 類也要跟著修改,一個類的依賴可能影響不大,但若有多個類依賴了 B 類,那么這個工作量將會相當(dāng)?shù)拇螅菀壮霈F(xiàn)修改錯誤,也會產(chǎn)生很多的重復(fù)代碼,這無疑是件非常痛苦的事;
  • 這種情況下,就需要將創(chuàng)建實(shí)例的工作從調(diào)用方(A類)中分離,與調(diào)用方「解耦」,也就是使用工廠方法創(chuàng)建實(shí)例的工作封裝起來(「減少代碼重復(fù)」),由工廠管理對象的創(chuàng)建邏輯,調(diào)用方不需要知道具體的創(chuàng)建過程,只管使用,「而降低調(diào)用者因?yàn)閯?chuàng)建邏輯導(dǎo)致的錯誤」;

二、實(shí)現(xiàn)

工廠模式根據(jù)抽象程度的不同可以分為:

  • 簡單工廠模式(Simple Factory)
  • 工廠方法模式(Factory Method)
  • 抽象工廠模式(Abstract Factory)

簡單工廠模式

簡單工廠模式也叫靜態(tài)工廠模式,用一個工廠對象創(chuàng)建同一類對象類的實(shí)例

假設(shè)我們要開發(fā)一個公司崗位及其工作內(nèi)容的錄入信息,不同崗位的工作內(nèi)容不一致

代碼如下:

  1. function Factory(career) { 
  2.     function User(career, work) { 
  3.         this.career = career  
  4.         this.work = work 
  5.     } 
  6.     let work 
  7.     switch(career) { 
  8.         case 'coder'
  9.             work =  ['寫代碼''修Bug']  
  10.             return new User(career, work
  11.             break 
  12.         case 'hr'
  13.             work = ['招聘''員工信息管理'
  14.             return new User(career, work
  15.             break 
  16.         case 'driver'
  17.             work = ['開車'
  18.             return new User(career, work
  19.             break 
  20.         case 'boss'
  21.             work = ['喝茶''開會''審批文件'
  22.             return new User(career, work
  23.             break 
  24.     } 
  25. let coder = new Factory('coder'
  26. console.log(coder) 
  27. let boss = new Factory('boss'
  28. console.log(boss) 

Factory就是一個簡單工廠。當(dāng)我們調(diào)用工廠函數(shù)時,只需要傳遞name、age、career就可以獲取到包含用戶工作內(nèi)容的實(shí)例對象

工廠方法模式

工廠方法模式跟簡單工廠模式差不多,但是把具體的產(chǎn)品放到了工廠函數(shù)的prototype中

這樣一來,擴(kuò)展產(chǎn)品種類就不必修改工廠函數(shù)了,變成抽象類,也可以隨時重寫某種具體的產(chǎn)品

也就是相當(dāng)于工廠總部不生產(chǎn)產(chǎn)品了,交給下轄分工廠進(jìn)行生產(chǎn);但是進(jìn)入工廠之前,需要有個判斷來驗(yàn)證你要生產(chǎn)的東西是否是屬于我們工廠所生產(chǎn)范圍,如果是,就丟給下轄工廠來進(jìn)行生產(chǎn)

如下代碼:

  1. // 工廠方法 
  2. function Factory(career){ 
  3.     if(this instanceof Factory){ 
  4.         var a = new this[career](); 
  5.         return a; 
  6.     }else
  7.         return new Factory(career); 
  8.     } 
  9. // 工廠方法函數(shù)的原型中設(shè)置所有對象的構(gòu)造函數(shù) 
  10. Factory.prototype={ 
  11.     'coder'function(){ 
  12.         this.careerName = '程序員' 
  13.         this.work = ['寫代碼''修Bug']  
  14.     }, 
  15.     'hr'function(){ 
  16.         this.careerName = 'HR' 
  17.         this.work = ['招聘''員工信息管理'
  18.     }, 
  19.     'driver'function () { 
  20.         this.careerName = '司機(jī)' 
  21.         this.work = ['開車'
  22.     }, 
  23.     'boss'function(){ 
  24.         this.careerName = '老板' 
  25.         this.work = ['喝茶''開會''審批文件'
  26.     } 
  27. let coder = new Factory('coder'
  28. console.log(coder) 
  29. let hr = new Factory('hr'
  30. console.log(hr) 

工廠方法關(guān)鍵核心代碼是工廠里面的判斷this是否屬于工廠,也就是做了分支判斷,這個工廠只做我能做的產(chǎn)品

抽象工廠模式

上述簡單工廠模式和工廠方法模式都是直接生成實(shí)例,但是抽象工廠模式不同,抽象工廠模式并不直接生成實(shí)例, 而是用于對產(chǎn)品類簇的創(chuàng)建

通俗點(diǎn)來講就是:簡單工廠和工廠方法模式的工作是生產(chǎn)產(chǎn)品,那么抽象工廠模式的工作就是生產(chǎn)工廠的

由于JavaScript中并沒有抽象類的概念,只能模擬,可以分成四部分:

  • 用于創(chuàng)建抽象類的函數(shù)
  • 抽象類
  • 具體類
  • 實(shí)例化具體類

上面的例子中有coder、hr、boss、driver四種崗位,其中coder可能使用不同的開發(fā)語言進(jìn)行開發(fā),比如JavaScript、Java等等。那么這兩種語言就是對應(yīng)的類簇

示例代碼如下:

  1. let CareerAbstractFactory = function(subType, superType) { 
  2.   // 判斷抽象工廠中是否有該抽象類 
  3.   if (typeof CareerAbstractFactory[superType] === 'function') { 
  4.     // 緩存類 
  5.     function F() {} 
  6.     // 繼承父類屬性和方法 
  7.     F.prototype = new CareerAbstractFactory[superType]() 
  8.     // 將子類的constructor指向父類 
  9.     subType.constructor = subType; 
  10.     // 子類原型繼承父類 
  11.     subType.prototype = new F() 
  12.   } else { 
  13.     throw new Error('抽象類不存在'
  14.   } 

上面代碼中CareerAbstractFactory就是一個抽象工廠方法,該方法在參數(shù)中傳遞子類和父類,在方法體內(nèi)部實(shí)現(xiàn)了子類對父類的繼承

三、應(yīng)用場景

從上面可看到,簡單簡單工廠的優(yōu)點(diǎn)就是我們只要傳遞正確的參數(shù),就能獲得所需的對象,而不需要關(guān)心其創(chuàng)建的具體細(xì)節(jié)

應(yīng)用場景也容易識別,有構(gòu)造函數(shù)的地方,就應(yīng)該考慮簡單工廠,但是如果函數(shù)構(gòu)建函數(shù)太多與復(fù)雜,會導(dǎo)致工廠函數(shù)變得復(fù)雜,所以不適合復(fù)雜的情況

抽象工廠模式一般用于嚴(yán)格要求以面向?qū)ο笏枷脒M(jìn)行開發(fā)的超大型項(xiàng)目中,我們一般常規(guī)的開發(fā)的話一般就是簡單工廠和工廠方法模式會用的比較多一些

綜上,工廠模式適用場景如下:

  • 如果你不想讓某個子系統(tǒng)與較大的那個對象之間形成強(qiáng)耦合,而是想運(yùn)行時從許多子系統(tǒng)中進(jìn)行挑選的話,那么工廠模式是一個理想的選擇
  • 將new操作簡單封裝,遇到new的時候就應(yīng)該考慮是否用工廠模式;
  • 需要依賴具體環(huán)境創(chuàng)建不同實(shí)例,這些實(shí)例都有相同的行為,這時候我們可以使用工廠模式,簡化實(shí)現(xiàn)的過程,同時也可以減少每種對象所需的代碼量,有利于消除對象間的耦合,提供更大的靈活性

參考文獻(xiàn)

https://www.runoob.com/design-pattern/factory-pattern.html

https://juejin.cn/post/6844903653774458888

 

https://zhuanlan.zhihu.com/p/344119981

 

責(zé)任編輯:武曉燕 來源: JS每日一題
相關(guān)推薦

2021-11-05 07:47:56

代理模式對象

2021-11-09 08:51:13

模式命令面試

2021-11-10 07:47:49

組合模式場景

2021-11-11 16:37:05

模板模式方法

2021-11-22 23:50:59

責(zé)任鏈模式場景

2021-09-16 07:52:18

算法應(yīng)用場景

2021-08-16 08:33:26

git

2021-11-04 06:58:32

策略模式面試

2021-09-06 10:51:27

TypeScriptJavaScript

2021-09-28 07:12:09

測試路徑

2021-09-29 07:24:20

場景數(shù)據(jù)

2021-10-08 09:59:32

冒泡排序場景

2021-09-10 06:50:03

TypeScript裝飾器應(yīng)用

2021-10-13 18:01:33

快速排序場景

2021-10-09 10:25:41

排序應(yīng)用場景

2021-09-08 07:49:34

TypeScript 泛型場景

2021-05-31 10:35:34

TCPWebSocket協(xié)議

2021-06-01 08:25:06

Node.jsJavaScript運(yùn)行

2021-10-18 07:51:39

回溯算法面試

2021-10-11 09:38:41

開源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久久久久久久久久久久九 | 亚洲成人免费网址 | 国产日韩欧美一区二区 | 日韩精品一区二区三区第95 | 一级黄色日本片 | 国产成人精品一区二三区在线观看 | 欧美中文字幕一区二区 | 一级黄色网页 | 免费观看成人鲁鲁鲁鲁鲁视频 | 精品亚洲一区二区 | 国产精品精品视频一区二区三区 | 第一区在线观看免费国语入口 | 国产精品伦理一区二区三区 | 成人做爰9片免费看网站 | 久久日韩精品一区二区三区 | 国产成人a亚洲精品 | 国产精品一区二区三区在线 | 欧美精品在线播放 | 亚洲综合免费 | 免费黄色av网站 | 一本一道久久a久久精品综合蜜臀 | 韩国成人在线视频 | 久久一区二 | 色www精品视频在线观看 | 国产精品一区二区三级 | 亚洲最新在线视频 | 黄色精品视频网站 | 九九爱这里只有精品 | 亚洲精品毛片av | 最新国产精品精品视频 | 欧美日韩亚洲一区 | 精品欧美一区二区在线观看 | 成人午夜视频在线观看 | 四虎影音| 91视频精选 | 亚洲精品一区二区三区蜜桃久 | 国产偷录叫床高潮录音 | 国产成人精品亚洲日本在线观看 | 九九九色| 一区二区在线观看免费视频 | 亚洲视频一区二区三区 |