es6有工廠模式;工廠模式將邏輯封裝到一個函數(shù)中,在es6中可以不使用構(gòu)造函數(shù)創(chuàng)建對象,而使用class配合static關(guān)鍵字將簡單工廠封裝到User類的靜態(tài)方法中,語法為“class User{構(gòu)造器}static 靜態(tài)方法(){}”。
本教程操作環(huán)境:windows10系統(tǒng)、ECMAScript 6.0版、Dell G3電腦。
es6有工廠模式嗎
ES6中給我們提供了class新語法,雖然class本質(zhì)上是一顆語法糖,并也沒有改變JavaScript是使用原型繼承的語言,但是確實讓對象的創(chuàng)建和繼承的過程變得更加的清晰和易讀。下面我們使用ES6的新語法來重寫上面的例子。
ES6重寫簡單工廠模式
使用ES6重寫簡單工廠模式時,我們不再使用構(gòu)造函數(shù)創(chuàng)建對象,而是使用class的新語法,并使用static關(guān)鍵字將簡單工廠封裝到User類的靜態(tài)方法中:
//User類 class User { //構(gòu)造器 constructor(opt) { this.name = opt.name; this.viewPage = opt.viewPage; } //靜態(tài)方法 static getInstance(role) { switch (role) { case 'superAdmin': return new User({ name: '超級管理員', viewPage: ['首頁', '通訊錄', '發(fā)現(xiàn)頁', '應(yīng)用數(shù)據(jù)', '權(quán)限管理'] }); break; case 'admin': return new User({ name: '管理員', viewPage: ['首頁', '通訊錄', '發(fā)現(xiàn)頁', '應(yīng)用數(shù)據(jù)'] }); break; case 'user': return new User({ name: '普通用戶', viewPage: ['首頁', '通訊錄', '發(fā)現(xiàn)頁'] }); break; default: throw new Error('參數(shù)錯誤, 可選參數(shù):superAdmin、admin、user') } } } //調(diào)用 let superAdmin = User.getInstance('superAdmin'); let admin = User.getInstance('admin'); let normalUser = User.getInstance('user');
工廠模式是最常見的一種開發(fā)模式,將new操作單獨封裝,當遇到new是應(yīng)考慮工廠模式。創(chuàng)建對象,不暴露代碼邏輯,把邏輯寫到函數(shù)里面。這個函數(shù)就是工廠模式。優(yōu)點,簡單。 缺點就是,每增加構(gòu)造函數(shù),都要修改函數(shù)里面的代碼邏輯。
工廠模式是用來創(chuàng)建對象的一種最常用的設(shè)計模式。我們不暴露創(chuàng)建對象的具體邏輯,而是將將邏輯封裝在一個函數(shù)中,那么這個函數(shù)就可以被視為一個工廠。工廠模式根據(jù)抽象程度的不同可以分為:簡單工廠,工廠方法和抽象工廠。
如果只接觸過JavaScript這門語言的的人可能會對抽象這個詞的概念有點模糊,因為JavaScript一直將abstract作為保留字而沒有去實現(xiàn)它。如果不能很好的理解抽象的概念,那么就很難理解工廠模式中的三種方法的異同。所以,我們先以一個場景去簡單的講述一下抽象和工廠的概念。
簡單工廠模式又叫靜態(tài)工廠模式,由一個工廠對象決定創(chuàng)建某一種產(chǎn)品對象類的實例。主要用來創(chuàng)建同一類對象。
在實際的項目中,我們常常需要根據(jù)用戶的權(quán)限來渲染不同的頁面,高級權(quán)限的用戶所擁有的頁面有些是無法被低級權(quán)限的用戶所查看。所以我們可以在不同權(quán)限等級用戶的構(gòu)造函數(shù)中,保存該用戶能夠看到的頁面。在根據(jù)權(quán)限實例化用戶。
代碼如下:
class SuperAdmin{ constructor(){ this.name = "超級管理員"; this.viewPage = ['首頁', '通訊錄', '發(fā)現(xiàn)頁', '應(yīng)用數(shù)據(jù)', '權(quán)限管理']; } } class Admin{ constructor(){ this.name = "管理員"; this.viewPage = ['首頁', '通訊錄', '發(fā)現(xiàn)頁', '應(yīng)用數(shù)據(jù)', '權(quán)限管理']; } } class NormalUser{ constructor(){ this.name = "普通用戶"; this.viewPage = ['首頁', '通訊錄', '發(fā)現(xiàn)頁', '應(yīng)用數(shù)據(jù)', '權(quán)限管理']; } } //工廠方法類 class UserFactory { getFactory(role){ switch (role) { case 'superAdmin': return new SuperAdmin(); break; case 'admin': return new Admin(); break; case 'user': return new NormalUser(); break; default: throw new Error('參數(shù)錯誤, 可選參數(shù):superAdmin、admin、user'); } } } //調(diào)用 let uesr =new UserFactory(); uesr.getFactory('superAdmin'); uesr.getFactory('admin'); uesr.getFactory('user');
簡單工廠的優(yōu)點在于,你只需要一個正確的參數(shù),就可以獲取到你所需要的對象,而無需知道其創(chuàng)建的具體細節(jié)。但是在函數(shù)內(nèi)包含了所有對象的創(chuàng)建邏輯(構(gòu)造函數(shù))和判斷邏輯的代碼,每增加新的構(gòu)造函數(shù)還需要修改判斷邏輯代碼。
當我們的對象不是上面的3個而是30個或