設計模式-如何理解工廠模式?node
定義: 建立對象的接口,讓子類決定實例化哪一個類。工廠方法將類的實例化延遲到子類,而子類能夠重寫接口方法以便建立的時候指定本身的對象類型。
須要根據不一樣參數產生不一樣實例,這些實例都有相同的行爲,這時候咱們可使用工廠模式,簡化實現的過程,同時也能夠減小每種對象所需的代碼量。工廠模式有利於消除對象間的耦合,提供更大的靈活性jquery
代碼理解:git
// 下方就是一個典型的工廠模式 // 首先建立對象的接口 const productManager = {}; productManager.createProductA = function () { console.log('ProductA'); } productManager.createProductB = function () { console.log('ProductB'); } productManager.factory = function (type) { // 工廠方法將類的實例化延遲到子類 return new productManager[type]; } // 讓子類決定實例化哪一個類 productManager.factory("createProductA");
若是還不理解的話,那咱們就再詳細一點咯,假如咱們想在網頁面裏插入一些元素,而這些元素類型不固定,多是圖片,也有多是鏈接,甚至多是文本,根據工廠模式的定義,咱們須要定義工廠類和相應的子類,咱們先來定義子類的具體實現(也就是子函數)github
var page = page || {}; page.dom = page.dom || {}; //子函數1:處理文本 page.dom.Text = function () { this.insert = function (where) { var txt = document.createTextNode(this.url); where.appendChild(txt); }; }; //子函數2:處理連接 page.dom.Link = function () { this.insert = function (where) { var link = document.createElement('a'); link.href = this.url; link.appendChild(document.createTextNode(this.url)); where.appendChild(link); }; }; //子函數3:處理圖片 page.dom.Image = function () { this.insert = function (where) { var im = document.createElement('img'); im.src = this.url; where.appendChild(im); }; };
那麼咱們如何定義工廠處理函數呢?其實很簡單:設計模式
page.dom.factory = function (type) { return new page.dom[type]; }
使用方式以下:app
var o = page.dom.factory('Link'); o.url = 'http://www.cnblogs.com'; o.insert(document.body);
jQuery中的$()其實就是一個工廠函數,它根據傳入參數的不一樣建立元素或者去尋找上下文中的元素,建立成相應的jQuery對象dom
// https://github.com/jquery/jquery/blob/master/src/core/init.js init = jQuery.fn.init = function( selector, context, root ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // Method init() accepts an alternate rootjQuery // so migrate can support jQuery.sub (gh-2101) root = root || rootjQuery; // Handle HTML strings if ( typeof selector === "string" ) { //... // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { //.... // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { //.... } return jQuery.makeArray( selector, this ); };
優勢函數
缺點學習
JS每日一題能夠當作是一個語音答題社區
天天利用碎片時間採用60秒內的語音形式來完成當天的考題
羣主在第二天0點推送當天的參考答案this