摘要:為了解決這個問題,我們可以使用工廠模式。框架中的工廠模式中的其實就是一個工廠函數,它根據傳入參數的不同創建元素或者去尋找上下文中的元素,創建成相應的對象。工廠模式有利于消除對象間的耦合,提供更大的靈活性。
定義本文首發于知乎專欄:前端指南
概述工廠模式定義創建對象的接口,但是讓子類決定實例化哪個類。工廠方法將類的實例化延遲到子類。
我們可以使用Object構造函數來創建單個對象,但是,使用同一個接口創建很多對象時,會產生大量重復的代碼。為了解決這個問題,我們可以使用工廠模式。
實例我們來看一個簡單的例子:
var employee1 = new Object(); employee1.position = "Front end engineer"; employee1.tool = "I love vscode."; employee1.introduction = function () { console.log("I am a " + this.position + ", and " + this.tool); } var employee2 = new Object(); employee2.position = "UI designer"; employee2.tool = "I love photoshop."; employee2.introduction = function () { console.log("I am a " + this.position + ", and " + this.tool); } employee1.introduction();//I am a Front end engineer, and I love vscode. employee2.introduction();//I am a UI designer, and I love photoshop.
在上邊這個例子中,我們定義了兩個employee,一個是Front End Engineer,另一個是UI designer,他們都有position屬性和tool屬性,也都有introduction方法。如果我們需要創建很多個類似employee的對象呢,那我們就需要重復很多類似的代碼。接下來,我們做一些簡單的修改:
function Employee(type) { var employee; if (type == "programmer") { employee = new Programmer(); } else if (type == "designer") { employee = new Designer(); } employee.introduction = function () { console.log("I am a " + this.position + ", and " + this.tool); } return employee; } function Programmer() { this.position = "Front end engineer"; this.tool = "I love vscode."; } function Designer() { this.position = "UI designer"; this.tool = "I love photoshop."; } var employee1 = Employee("programmer"); employee1.introduction();//I am a Front end engineer, and I love vscode. var employee2 = Employee("designer"); employee2.introduction();//I am a UI designer, and I love photoshop.
在上邊這段代碼中,我們將employee的初始化分別放到了Programmer()和Designer()中實現。這其實就是一個簡單工廠模式的例子,Employee是一個工廠,可以根據傳入的type的不同,創建不同的employee,每個employee有自己的職位和使用的工具,每個employee都可以介紹自己的這些信息。
框架中的工廠模式jQuery中的$()其實就是一個工廠函數,它根據傳入參數的不同創建元素或者去尋找上下文中的元素,創建成相應的jQuery對象。
以下實例來自于https://github.com/jquery/jqu...
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 ); };
同時,像Angular2、Node、Vue、React等等,很多開源框架中其實都用到了工廠模式,學會工廠模式,有助于你更好的理解和使用這些框架。
總結當需要根據不同參數產生不同實例,這些實例都有相同的行為,這時候我們可以使用工廠模式,簡化實現的過程,同時也可以減少每種對象所需的代碼量。工廠模式有利于消除對象間的耦合,提供更大的靈活性。
注:如果不需要另外一個類,或者不需要在運行期間判斷實例化的對象屬于哪個類,那就不需要使用工廠模式,大多數情況下使用new關鍵字和構造函數公開實例化對象,提高代碼可讀性。切勿濫用。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82944.html
摘要:大潮來襲前端開發能做些什么去年谷歌和火狐針對提出了的標準,顧名思義,即的體驗方式,我們可以戴著頭顯享受沉浸式的網頁,新的標準讓我們可以使用語言來開發。 VR 大潮來襲 --- 前端開發能做些什么 去年谷歌和火狐針對 WebVR 提出了 WebVR API 的標準,顧名思義,WebVR 即 web + VR 的體驗方式,我們可以戴著頭顯享受沉浸式的網頁,新的 API 標準讓我們可以使用 ...
摘要:對于這個問題,接下來的工廠方法模式可以解決這個問題。二工廠方法模式的優點擁有良好的封裝性,代碼結構清晰。參考系列源地址系列目錄設計模式概述設計模式一簡單工廠模式設計模式二工廠方法模式設計模式三抽象工廠模式設計模式四單例模式 簡單工廠簡述: 簡單工廠模式實現了產品類的代碼跟客戶端代碼分離,但會有一個問題,優秀的代碼是符合開閉原則如果你要加一個C類產品,你就要修改工廠類里面的代碼,也就是說...
摘要:集中實例化的函數第一個實例第二個實例工廠模式的分類工廠模式分為簡單工廠抽象工廠和智能工廠,工廠模式不顯示地要求使用一個構造函數。工廠模式之弊大多數類最好使用關鍵字和構造函數,可以讓代碼更加簡單易讀。帶原型的構造器中有一個名為的屬性。 什么是模式 前陣子準備期末考試,挺累也挺忙的,實在閑不得空來更新文章,今天和大家說說javascript中的設計模式。 首先呢,我們需要知道的是:模式是一...
閱讀 1217·2023-04-25 20:31
閱讀 3723·2021-10-14 09:42
閱讀 1494·2021-09-22 16:06
閱讀 2660·2021-09-10 10:50
閱讀 3529·2021-09-07 10:19
閱讀 1778·2019-08-30 15:53
閱讀 1176·2019-08-29 15:13
閱讀 2823·2019-08-29 13:20