JS工廠模式


什么是工廠模式?

工廠模式是一種用來創建對象的設計模式。我們不暴露對象創建的邏輯,而是將邏輯封裝在一個函數內,那么這個函數可以成為工廠。工廠模式根據抽象程度的不同可以分為: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等對象了,使用安全模式可以很好的解決這個問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM