工廠模式建立對象(視爲工廠裏的產品)時無需指定建立對象的具體類。
工廠模式定義一個用於建立對象的接口,這個接口由子類決定實例化哪個類。該模式使一個類的實例化延遲到了子類。而子類能夠重寫接口方法以便建立的時候指定本身的對象類型。
這個模式十分有用,尤爲是建立對象的流程賦值的時候,好比依賴於不少設置文件等。而且,你會常常在程序裏看到工廠方法,用於讓子類定義須要建立的對象類型。
// 安全模式建立的工廠類 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
和原生的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