摘要:為了解決這個問題,我們可以使用工廠模式??蚣苤械墓S模式中的其實就是一個工廠函數(shù),它根據(jù)傳入?yún)?shù)的不同創(chuàng)建元素或者去尋找上下文中的元素,創(chuàng)建成相應(yīng)的對象。工廠模式有利于消除對象間的耦合,提供更大的靈活性。
定義本文首發(fā)于知乎專欄:前端指南
概述工廠模式定義創(chuàng)建對象的接口,但是讓子類決定實例化哪個類。工廠方法將類的實例化延遲到子類。
我們可以使用Object構(gòu)造函數(shù)來創(chuàng)建單個對象,但是,使用同一個接口創(chuàng)建很多對象時,會產(chǎn)生大量重復(fù)的代碼。為了解決這個問題,我們可以使用工廠模式。
實例我們來看一個簡單的例子:
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方法。如果我們需要創(chuàng)建很多個類似employee的對象呢,那我們就需要重復(fù)很多類似的代碼。接下來,我們做一些簡單的修改:
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()中實現(xiàn)。這其實就是一個簡單工廠模式的例子,Employee是一個工廠,可以根據(jù)傳入的type的不同,創(chuàng)建不同的employee,每個employee有自己的職位和使用的工具,每個employee都可以介紹自己的這些信息。
框架中的工廠模式jQuery中的$()其實就是一個工廠函數(shù),它根據(jù)傳入?yún)?shù)的不同創(chuàng)建元素或者去尋找上下文中的元素,創(chuàng)建成相應(yīng)的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等等,很多開源框架中其實都用到了工廠模式,學(xué)會工廠模式,有助于你更好的理解和使用這些框架。
總結(jié)當(dāng)需要根據(jù)不同參數(shù)產(chǎn)生不同實例,這些實例都有相同的行為,這時候我們可以使用工廠模式,簡化實現(xiàn)的過程,同時也可以減少每種對象所需的代碼量。工廠模式有利于消除對象間的耦合,提供更大的靈活性。
注:如果不需要另外一個類,或者不需要在運行期間判斷實例化的對象屬于哪個類,那就不需要使用工廠模式,大多數(shù)情況下使用new關(guān)鍵字和構(gòu)造函數(shù)公開實例化對象,提高代碼可讀性。切勿濫用。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/82944.html
摘要:大潮來襲前端開發(fā)能做些什么去年谷歌和火狐針對提出了的標(biāo)準(zhǔn),顧名思義,即的體驗方式,我們可以戴著頭顯享受沉浸式的網(wǎng)頁,新的標(biāo)準(zhǔn)讓我們可以使用語言來開發(fā)。 VR 大潮來襲 --- 前端開發(fā)能做些什么 去年谷歌和火狐針對 WebVR 提出了 WebVR API 的標(biāo)準(zhǔn),顧名思義,WebVR 即 web + VR 的體驗方式,我們可以戴著頭顯享受沉浸式的網(wǎng)頁,新的 API 標(biāo)準(zhǔn)讓我們可以使用 ...
摘要:對于這個問題,接下來的工廠方法模式可以解決這個問題。二工廠方法模式的優(yōu)點擁有良好的封裝性,代碼結(jié)構(gòu)清晰。參考系列源地址系列目錄設(shè)計模式概述設(shè)計模式一簡單工廠模式設(shè)計模式二工廠方法模式設(shè)計模式三抽象工廠模式設(shè)計模式四單例模式 簡單工廠簡述: 簡單工廠模式實現(xiàn)了產(chǎn)品類的代碼跟客戶端代碼分離,但會有一個問題,優(yōu)秀的代碼是符合開閉原則如果你要加一個C類產(chǎn)品,你就要修改工廠類里面的代碼,也就是說...
摘要:集中實例化的函數(shù)第一個實例第二個實例工廠模式的分類工廠模式分為簡單工廠抽象工廠和智能工廠,工廠模式不顯示地要求使用一個構(gòu)造函數(shù)。工廠模式之弊大多數(shù)類最好使用關(guān)鍵字和構(gòu)造函數(shù),可以讓代碼更加簡單易讀。帶原型的構(gòu)造器中有一個名為的屬性。 什么是模式 前陣子準(zhǔn)備期末考試,挺累也挺忙的,實在閑不得空來更新文章,今天和大家說說javascript中的設(shè)計模式。 首先呢,我們需要知道的是:模式是一...
閱讀 1287·2023-04-25 20:31
閱讀 3779·2021-10-14 09:42
閱讀 1562·2021-09-22 16:06
閱讀 2761·2021-09-10 10:50
閱讀 3622·2021-09-07 10:19
閱讀 1865·2019-08-30 15:53
閱讀 1243·2019-08-29 15:13
閱讀 2887·2019-08-29 13:20