什么是工廠模式?
工廠模式是一種用來創建對象的設計模式。我們不暴露對象創建的邏輯,而是將邏輯封裝在一個函數內,那么這個函數可以成為工廠。工廠模式根據抽象程度的不同可以分為:1.簡單工廠 2.工廠方法 3.抽象工廠
1.簡單工廠:
let factory = function (role) { function superman() { this.name ='超級管理員', this.role = ['修改密碼', '發布消息', '查看主頁'] } function commonMan() { this.name = '普通游客', this.role = ['查看主頁'] } switch(role) { case 'superman': return new superman(); break; case 'man': return new commonMan(); break; default: throw new Error('參數錯誤') } } let superman = factory('superman'); let man = factory('man');
在上述代碼中,factory就是一個簡單的工廠,該工廠中有二個構造函數分別對應不同的權限。我們只需要傳遞相應的參數就可以獲取一個實例對象了。工廠內部的構造函數有相似的地方,還可以進一步優化。
let factory = function (role) { function User(obj) { this.name = obj.name; this.role = obj.role; } switch(role) { case 'superman': return new User({ name: '平台用戶', role: ['主頁', '登錄頁'] }) break; case 'man': return new User({ name: '游客', role: ['登錄頁']}) break; default: throw new Error('參數錯誤') } } let superman = factory('superman'); let man = factory('man');
簡單工廠的優點: 你只需要傳遞一個合法的參數,就可以獲取到你想要的對象,而無需知道創建的具體的細節。但是在函數內包含了所有對象的構造函數和判斷邏輯的代碼, 每次如果需要添加一個對象,那么我們需要新增一個構造函數,當我們需要維護的對象不是上面這2個,而是20個或者更多,那么這個函數將會成為超級函數,使得我們難以維護。所以簡單工廠模式只適用於在創建時對象數量少,以及邏輯簡單的情況。
2.工廠方法:
工廠方法模式本意是將實際創造的對象推遲到子類中,這樣核心類就變成了抽象類。但是在js中很難像那些傳統面向對象語言那樣去實現抽象類,所以在js中我們只需要參考他的思想即可。
我們可以把工廠函數看成是一個工廠類。在簡單模式我們,我們添加一個新的對象需要修改二處地方,在加入工廠方法模式以后,我們只需要修改一處即可。工廠方法的工廠類,他只做實例化這一件事情。我們只需要修改他的原型類即可。我們采用安全模式創建工廠對象。
let factory = function (role) { if(this instanceof factory) { var s = new this[role](); return s; } else { return new factory(role); } } factory.prototype = { admin: function() { this.name = '平台用戶'; this.role = ['登錄頁', '主頁'] }, common: function() { this.name = '游客'; this.role = ['登錄頁'] }, test: function() { this.name = '測試'; this.role = ['登錄頁', '主頁', '測試頁']; this.test = '我還有一個測試屬性哦' } } let admin = new factory('admin'); let common = new factory('common'); let test = new factory('test');
在上述代碼中要是忘記加new了, 那么我們就獲取不到admin,common等對象了,使用安全模式可以很好的解決這個問題。