新聞動態(tài)
說說對工廠模式的理解?應用場景?
常見問題 發(fā)布者:ou3377 2021-12-16 17:29 訪問量:309
工廠模式是用來創(chuàng)建對象的一種最常用的設計模式,不暴露創(chuàng)建對象的具體邏輯,而是將將邏輯封裝在一個函數(shù)中,那么這個函數(shù)就可以被視為一個工廠
其就像工廠一樣重復的產生類似的產品,工廠模式只需要我們傳入正確的參數(shù),就能生產類似的產品
舉個例子:
工廠模式根據(jù)抽象程度的不同可以分為:
簡單工廠模式也叫靜態(tài)工廠模式,用一個工廠對象創(chuàng)建同一類對象類的實例
假設我們要開發(fā)一個公司崗位及其工作內容的錄入信息,不同崗位的工作內容不一致
代碼如下:
function Factory(career) {
function User(career, work) {
this.career = career
this.work = work
}
let work
switch(career) {
case 'coder':
work = ['寫代碼', '修Bug']
return new User(career, work)
break
case 'hr':
work = ['招聘', '員工信息管理']
return new User(career, work)
break
case 'driver':
work = ['開車']
return new User(career, work)
break
case 'boss':
work = ['喝茶', '開會', '審批文件']
return new User(career, work)
break
}
}
let coder = new Factory('coder')
console.log(coder)
let boss = new Factory('boss')
console.log(boss)
Factory
就是一個簡單工廠。當我們調用工廠函數(shù)時,只需要傳遞name、age、career就可以獲取到包含用戶工作內容的實例對象
工廠方法模式跟簡單工廠模式差不多,但是把具體的產品放到了工廠函數(shù)的prototype
中
這樣一來,擴展產品種類就不必修改工廠函數(shù)了,變成抽象類,也可以隨時重寫某種具體的產品
也就是相當于工廠總部不生產產品了,交給下轄分工廠進行生產;但是進入工廠之前,需要有個判斷來驗證你要生產的東西是否是屬于我們工廠所生產范圍,如果是,就丟給下轄工廠來進行生產
如下代碼:
// 工廠方法
function Factory(career){
if(this instanceof Factory){
var a = new this[career]();
return a;
}else{
return new Factory(career);
}
}
// 工廠方法函數(shù)的原型中設置所有對象的構造函數(shù)
Factory.prototype={
'coder': function(){
this.careerName = '程序員'
this.work = ['寫代碼', '修Bug']
},
'hr': function(){
this.careerName = 'HR'
this.work = ['招聘', '員工信息管理']
},
'driver': function () {
this.careerName = '司機'
this.work = ['開車']
},
'boss': function(){
this.careerName = '老板'
this.work = ['喝茶', '開會', '審批文件']
}
}
let coder = new Factory('coder')
console.log(coder)
let hr = new Factory('hr')
console.log(hr)
工廠方法關鍵核心代碼是工廠里面的判斷this是否屬于工廠,也就是做了分支判斷,這個工廠只做我能做的產品
上述簡單工廠模式和工廠方法模式都是直接生成實例,但是抽象工廠模式不同,抽象工廠模式并不直接生成實例, 而是用于對產品類簇的創(chuàng)建
通俗點來講就是:簡單工廠和工廠方法模式的工作是生產產品,那么抽象工廠模式的工作就是生產工廠的
由于JavaScript
中并沒有抽象類的概念,只能模擬,可以分成四部分:
上面的例子中有coder
、hr
、boss
、driver
四種崗位,其中coder
可能使用不同的開發(fā)語言進行開發(fā),比如JavaScript
、Java
等等。那么這兩種語言就是對應的類簇
示例代碼如下:
let CareerAbstractFactory = function(subType, superType) {
// 判斷抽象工廠中是否有該抽象類
if (typeof CareerAbstractFactory[superType] === 'function') {
// 緩存類
function F() {}
// 繼承父類屬性和方法
F.prototype = new CareerAbstractFactory[superType]()
// 將子類的constructor指向父類
subType.constructor = subType;
// 子類原型繼承父類
subType.prototype = new F()
} else {
throw new Error('抽象類不存在')
}
}
上面代碼中CareerAbstractFactory
就是一個抽象工廠方法,該方法在參數(shù)中傳遞子類和父類,在方法體內部實現(xiàn)了子類對父類的繼承
從上面可看到,簡單簡單工廠的優(yōu)點就是我們只要傳遞正確的參數(shù),就能獲得所需的對象,而不需要關心其創(chuàng)建的具體細節(jié)
應用場景也容易識別,有構造函數(shù)的地方,就應該考慮簡單工廠,但是如果函數(shù)構建函數(shù)太多與復雜,會導致工廠函數(shù)變得復雜,所以不適合復雜的情況
抽象工廠模式一般用于嚴格要求以面向對象思想進行開發(fā)的超大型項目中,我們一般常規(guī)的開發(fā)的話一般就是簡單工廠和工廠方法模式會用的比較多一些
綜上,工廠模式適用場景如下:
關鍵字: 工廠模式
文章連接: http://www.hsjyfc.com.cn/cjwt/827.html
版權聲明:文章由 晨展科技 整理收集,來源于互聯(lián)網(wǎng)或者用戶投稿,如有侵權,請聯(lián)系我們,我們會立即刪除。如轉載請保留