摘要:設(shè)計(jì)模式工廠模式最近閱讀了幾本設(shè)計(jì)模式方面的書籍學(xué)習(xí)之余整理下來(lái)方便以后的歸納和梳理設(shè)計(jì)模式工廠模式創(chuàng)造工廠模式是一種創(chuàng)建性模式也就是一種創(chuàng)建對(duì)象的最佳實(shí)踐首先我們需要理解為什么我們需要工廠模式想象一個(gè)場(chǎng)景如果你要求去買一些東西板燒雞腿
Javascript設(shè)計(jì)模式-工廠模式
最近閱讀了幾本設(shè)計(jì)模式方面的書籍,學(xué)習(xí)之余整理下來(lái),方便以后的歸納和梳理
設(shè)計(jì)模式-工廠模式創(chuàng)造工廠模式是一種創(chuàng)建性模式,也就是一種創(chuàng)建對(duì)象的最佳實(shí)踐.首先我們需要理解:
為什么我們需要工廠模式?想象一個(gè)場(chǎng)景:如果你要求去買一些東西:板燒雞腿漢堡,可樂和薯?xiàng)l,那么人們會(huì)非常自然的跑去麥當(dāng)勞去購(gòu)買對(duì)吧.
為什么我們會(huì)想到去麥當(dāng)勞呢?因?yàn)檫@些東西都是一類食物,然后麥當(dāng)勞作為一個(gè)"工廠",可以一條龍的提供給消費(fèi)者,如果沒有麥當(dāng)勞,那么我們需要分別去可樂,薯?xiàng)l和板燒雞腿漢堡的店面去分別買這些食物,那么購(gòu)買效率會(huì)很低.所以可以說(shuō)麥當(dāng)勞就是一個(gè)銷售食物的工廠模式.
所以我們可以這樣理解工廠模式,把相關(guān)的多個(gè)類(薯?xiàng)l,可樂等)提供一個(gè)統(tǒng)一入口的一個(gè)模式,讓你從一個(gè)入口就可以獲得多個(gè)類,提高工作效率.
但是對(duì)于工廠模式也會(huì)有三種類型的實(shí)現(xiàn)方式,分別是:簡(jiǎn)單工廠模式,工廠方法模式和抽象工廠模式.它們分別是在各自基礎(chǔ)上有一定的改進(jìn).
簡(jiǎn)單工廠模式也被叫做靜態(tài)工廠模式(Simple Factory Patter),主要用于創(chuàng)建同一類的對(duì)象.
適用情況:如果被要求寫一些球類的實(shí)現(xiàn),那么一般情況的話我們會(huì)這樣實(shí)現(xiàn):
var Football = function(){ this.name = "football"; .... } var Basketball = function(){ this.name = "basketball"; .... }
這種寫法有一些缺陷:返回了多個(gè)類,不便于他人使用.因此我們考慮把這些類似的類封裝到一個(gè)工廠里面,也就有了我們的簡(jiǎn)單工廠模式:
var BallFactory; !(function(){ BallFactory = function(type,cfg){ var Football = function(cfg){ this.name = "football"; console.log(this.name + " in the prototype"); }; Football.prototype = { call:function(){console.log(this.name)}, sell:function(){} }; var Basketball = function(cfg) { this.name = "basketball"; console.log(this.name); }; var cfg = cfg ||{}; switch(type){ case "football": return new Football(cfg); break; case "basketball": return new Basketball(cfg); break; } }; })(); var aFootball = BallFactory("football"); aFootball.call();
因此使用BallFactory把這些內(nèi)容包裹起來(lái)給其他人使用就會(huì)避免返回了多個(gè)類的問題,所以這就是簡(jiǎn)單工廠模式想解決的問題:
統(tǒng)一創(chuàng)建的入口.
當(dāng)然在實(shí)際的使用過程中,我們會(huì)使用一些其它技巧:
如果工廠的產(chǎn)品中有很多重復(fù)部分,那么我們需要把重復(fù)的部分抽象出來(lái)成為共同的部分,不同的部分放入switch里面:
var GetChildren = function(cfg){ cfg = cfg||{}; this.name = cfg.name; this.height = cfg.height; this.speak = function(){}; //抽離出不同的部分 switch(cfg.gender){ case "boy": this.gender = cfg.gender; this.moustouch = .... .....; //特有部分 break; case "girl": this.gender = cfg.gender; ....... break; } return this; } var aBoy = GetChildren({.....});工廠方法模式
在簡(jiǎn)單工廠模式的基礎(chǔ)上,我們已經(jīng)解決了入口不統(tǒng)一的問題,但是還有一個(gè)問題沒有解決:
加入一個(gè)新的類需要修改多部分:首先我們需要在BallFactory工廠內(nèi)部加入如何實(shí)現(xiàn),然后加到switch部分;所以這是一次修改的需求,我們需要修改多個(gè)地方.
那么我們看能不能嘗試更抽象一點(diǎn),盡可能減少需要修改的地方;
var BallFactory = function(type,cfg){ this.name = cfg.name; //共同的部分放在這里 return this[type](cfg); }; BallFactory.prototype = { football:function(cfg){ console.log("這里加入和football相關(guān)的獨(dú)特內(nèi)容" +this.name); }, basketball:function(cfg) { console.log("這里加入和basketball相關(guān)的獨(dú)特內(nèi)容" +this.name); } }; var aBall = new BallFactory("football",{name:"football"}); //football in the prototype
所以這里加入了一個(gè)return this[type](cfg)的方法自動(dòng)代替了之前的switch的方法.以后需要加入內(nèi)容只需要修改BallFactory的prototype就可以了.
當(dāng)然我們還可以添加一種安全模式來(lái)解決如果不在構(gòu)造函數(shù)前面加上new的話,會(huì)報(bào)錯(cuò)的問題.解決的思路其實(shí)是把new封裝在構(gòu)造函數(shù)之內(nèi):
var BallFactory = function(type,cfg){ if(!(this instanceof BallFactory)){ return new BallFactory(type,cfg); //多一行判斷即:如果沒有帶new,我自己幫你new一個(gè)返回就好; } this.name = cfg.name; return this[type](cfg); }; var aBall = BallFactory("football",{name:"football"}); //這里如果掉了new也會(huì)正常執(zhí)行;
所以,我們可以看到的是,我們使用簡(jiǎn)單工廠模式解決了入口不統(tǒng)一的問題,然后使用工廠模式解決了修改地點(diǎn)不統(tǒng)一的問題
抽象工廠模式一般來(lái)說(shuō),抽象工廠在大型項(xiàng)目的使用更多,大概的思路是在父類里面設(shè)計(jì)好接口(沒有具體實(shí)現(xiàn)),具體的實(shí)現(xiàn)等到了子類再重寫.
這里借用一個(gè)張容銘的
var Car = function(){}; Car.prototype = { getPrice:function(){ throw new Error("抽象方法不能調(diào)用")}, getSpeed:function(){ throw new Error("抽象方法不能調(diào)用")} }; //這里使用Object.create()繼承,子類到父類中會(huì)多一個(gè)中間過渡函數(shù)Temp(){};防止在子類的prototype覆蓋父類;可見參考資料 aBMW = Object.create(Car.prototype); aBMW.getPrice(); // 抽象方法不能調(diào)用 aBMW.getPrice = function(){ console.log("I am getting price"); }; aBMW.getPrice(); //I am getting price
父類定義好接口,具體實(shí)現(xiàn)延遲到子類才實(shí)現(xiàn).
所以總結(jié)來(lái)說(shuō):
簡(jiǎn)單工廠模式解決了入口不統(tǒng)一的問題,
工廠模式解決了修改地點(diǎn)不統(tǒng)一的問題,
抽象工廠模式解決了子類實(shí)現(xiàn)不規(guī)范的問題
參考資料Javascript設(shè)計(jì)模式 張容銘
深入理解JavaScript系列(28):設(shè)計(jì)模式之工廠模式
工廠模式
Object.create()使用方式
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/91343.html
摘要:從設(shè)計(jì)模式的分類來(lái)看簡(jiǎn)單工廠模式是創(chuàng)建型模式。使用簡(jiǎn)單工廠模式將會(huì)增加系統(tǒng)中類的個(gè)數(shù),在一定程序上增加了系統(tǒng)的復(fù)雜度和理解難度。簡(jiǎn)單工廠模式由于使用了靜態(tài)工廠方法,造成工廠角色無(wú)法形成基于繼承的等級(jí)結(jié)構(gòu)。 簡(jiǎn)單工廠模式提供了一個(gè)接口可以根據(jù)傳遞的參數(shù)的不同創(chuàng)建不同的對(duì)象,從而將對(duì)象自身的邏輯與對(duì)象的創(chuàng)建分離開。 從設(shè)計(jì)模式的分類來(lái)看簡(jiǎn)單工廠模式是創(chuàng)建型模式。事實(shí)上與簡(jiǎn)單工廠模式類似的還...
摘要:工廠方法模式,通過對(duì)產(chǎn)品類的抽象使其創(chuàng)建業(yè)務(wù),主要負(fù)責(zé)創(chuàng)建多類產(chǎn)品的實(shí)例。安全模式類安全模式類可以屏蔽使用類的錯(cuò)誤造成的錯(cuò)誤。可以將工廠方法看作是一個(gè)實(shí)例化對(duì)象的工廠類,安全起見,采用安全模式類,將創(chuàng)建對(duì)象的基類放在工廠方法類的原型中即可。 工廠方法模式,通過對(duì)產(chǎn)品類的抽象使其創(chuàng)建業(yè)務(wù),主要負(fù)責(zé)創(chuàng)建多類產(chǎn)品的實(shí)例。前面記錄了簡(jiǎn)單工廠模式,但是需求時(shí)不斷變化的,當(dāng)需求簡(jiǎn)單時(shí),直接創(chuàng)建對(duì)象...
摘要:設(shè)計(jì)模式共有種,我今天先來(lái)了解一下工廠模式,其他的模式將會(huì)在后續(xù)的博客中陸續(xù)為大家講解。工廠模式主要分為簡(jiǎn)單工廠模式和抽象工廠模式。抽象工廠模式抽象工廠模式與簡(jiǎn)單工廠函數(shù)不同的是,抽象工廠函數(shù)會(huì)先設(shè)計(jì)好接口,具體的實(shí)現(xiàn)在子類中進(jìn)行。 設(shè)計(jì)模式 設(shè)計(jì)模式(design pattern)概念:是一套反復(fù)使用、思想成熟、經(jīng)過分類和無(wú)數(shù)實(shí)戰(zhàn)設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。是為了代碼可重用、可擴(kuò)展、可解耦、更容...
摘要:都是構(gòu)造函數(shù)模式創(chuàng)建的原生構(gòu)造函數(shù)。使用構(gòu)造函數(shù)創(chuàng)建對(duì)象經(jīng)歷了以下四個(gè)過程創(chuàng)建一個(gè)新對(duì)象構(gòu)造函數(shù)的作用域交給新對(duì)象。 ??在創(chuàng)建對(duì)象的時(shí)候,使用對(duì)象字面量和 new Object() 構(gòu)造函數(shù)的方式創(chuàng)建一個(gè)對(duì)象是最簡(jiǎn)單最方便的方式。但是凡是處于初級(jí)階段的事物都會(huì)不可避免的存在一個(gè)問題,沒有普適性,意思就是說(shuō)我要為世界上(程序中)的所有使用到的對(duì)象都使用一遍 var xxx = {} ,...
摘要:都是構(gòu)造函數(shù)模式創(chuàng)建的原生構(gòu)造函數(shù)。使用構(gòu)造函數(shù)創(chuàng)建對(duì)象經(jīng)歷了以下四個(gè)過程創(chuàng)建一個(gè)新對(duì)象構(gòu)造函數(shù)的作用域交給新對(duì)象。 ??在創(chuàng)建對(duì)象的時(shí)候,使用對(duì)象字面量和 new Object() 構(gòu)造函數(shù)的方式創(chuàng)建一個(gè)對(duì)象是最簡(jiǎn)單最方便的方式。但是凡是處于初級(jí)階段的事物都會(huì)不可避免的存在一個(gè)問題,沒有普適性,意思就是說(shuō)我要為世界上(程序中)的所有使用到的對(duì)象都使用一遍 var xxx = {} ,...
閱讀 2513·2023-04-25 17:27
閱讀 1824·2019-08-30 15:54
閱讀 2369·2019-08-30 13:06
閱讀 2980·2019-08-30 11:04
閱讀 746·2019-08-29 15:30
閱讀 729·2019-08-29 15:16
閱讀 1733·2019-08-26 10:10
閱讀 3603·2019-08-23 17:02