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