JavaScript設計模式-工廠模式

工廠模式建立對象(視爲工廠裏的產品)時無需指定建立對象的具體類。
工廠模式定義一個用於建立對象的接口,這個接口由子類決定實例化哪個類。該模式使一個類的實例化延遲到了子類。而子類能夠重寫接口方法以便建立的時候指定本身的對象類型。
這個模式十分有用,尤爲是建立對象的流程賦值的時候,好比依賴於不少設置文件等。而且,你會常常在程序裏看到工廠方法,用於讓子類定義須要建立的對象類型。
// 安全模式建立的工廠類
var Factory = function (type, content) {
    if (this instanceof Factory) {
        return this[type](content);
    } else {
        return new Factory(type, content);
    }
}

// 工廠原型中設置建立全部類型數據的基類
Factory.prototype = {
    Yuwen: function (content) {
        console.log(content);
    },
    Shuxue: function(content) {
        console.log(content);
    },
    English: function(content) {
        console.log(content);
    }
}

var data = [
    {
        type: 'Yuwen',
        content: '我是語文老師!'
    },
    {
        type: 'Shuxue',
        content: '我是數學老師!'
    },
    {
        type: 'English',
        content: '我是英語老師!'
    }
];

for (var i = 0; i < data.length; i++) {
    Factory(data[i].type, data[i].content);
}

源碼中的工廠模式javascript

  • Vue中的工廠模式

和原生的document.createElement 相似,Vue在生成虛擬DOM的時候,提供了createElement方法用來生成VNode,用來做爲真實DOM節點的映射:java

createElement('div', { class: 'body' }, [
    createElement('a', { class: 'title', attrs: { href: 'www.baidu.com' } }),
    createElement('span', { class: 'content' }, '百度網址')
])

createElement 函數結構大概以下:node

class Vnode (tag, data, children) { ... }

function createElement(tag, data, children) {
      return new Vnode(tag, data, children)
}

能夠看到Vue提供的 createElement 工廠方法封裝了複雜的建立過程,對於使用者來講就很方便了。安全

何時使用工廠模式函數

如下幾種情景下工廠模式特別有用:測試

  • 對象的構建十分複雜
  • 須要依賴具體環境建立不一樣實例
  • 處理大量具備相同屬性的小對象

何時不應用工廠模式this

不濫用運用工廠模式,有時候僅僅只是給代碼增長了沒必要要的複雜度,同時使得測試難以運行下去。spa

相關文章
相關標籤/搜索