摘要:設計模式共有種,我今天先來了解一下工廠模式,其他的模式將會在后續的博客中陸續為大家講解。工廠模式主要分為簡單工廠模式和抽象工廠模式。抽象工廠模式抽象工廠模式與簡單工廠函數不同的是,抽象工廠函數會先設計好接口,具體的實現在子類中進行。
設計模式
設計模式(design pattern)概念:
是一套反復使用、思想成熟、經過分類和無數實戰設計經驗的總結。是為了代碼可重用、可擴展、可解耦、更容易被人理解和保證代碼可靠性。
設計模式共有23種,我今天先來了解一下工廠模式(Factory Pattern),其他的模式將會在后續的博客中陸續為大家講解。
工廠模式工廠模式,正像它的名字一樣,可以像工廠一樣生產出我們想要的東西,只要我們提供原料。在我們日常編寫代碼過程中,很可能,我們不知不覺中就已經使用過工廠模式。我們看一個簡單的例子:
//工廠模式很基礎的的一個例子 function createPerson (name,age) { var person = new Object(); person.name = name; person.age = age; return person; } var Holz = createPerson ("Holz", "21"); console.log(Holz); /* { age: "21", name: "Holz" } */ var Tom = createPerson ("Tom", "7"); console.log(Tom); /* { age: "7", name: "Tom" } */
在這個函數中,我可以通過傳入不同的參數,創建具有不同參數值得對象。可以看到,工廠模式其實很簡單。
工廠模式(Factory Pattern)主要分為簡單工廠模式和抽象工廠模式。簡單工廠模式
簡單工廠(Simple Factory Pattern)模式主要用于創建同一類的對象,比如我們創建需要一個身份,老師或者學生。可以通過下面這個函數:
//簡單工廠模式。 var simpleCreatePerson = function (type, person) { return this[type](person); } simpleCreatePerson.prototype = { student: function (person) { var Astudent = new Object(); Astudent.name = person.name; Astudent.age = person.age; return Astudent; }, teacher: function (person) { var Ateacher = new Object(); Ateacher.name = person.name; Ateacher.age = person.age; return Ateacher; } } var teacher = new simpleCreatePerson("teacher", {name:"鄭老師", age:25 }); var student = new simpleCreatePerson("student", {name:"鄭同學", age:21 }); console.log(teacher); /* this is a teacher {name:"鄭老師", age: 25} */ console.log(student); /* this is a teacher {name:"鄭同學", age: 25} */
我們可以傳入不同的 type 比如"student"或“teacher”去創建不同的對象,然后再通過不同的person對象去給里面的屬性賦值。無論是"student"或者"teacher"都是person,所以說簡單工廠函數就是用來創建同一類對象的不同實例。
上面的代碼通過原型_prototype_去添加兩個函數,(關于原型的知識,不是一兩句可以講完的,如果不懂得話,大家可以到網上去搜索相關的資料進行了解)然后通過this[type]去選擇不同的方法,如果這里不明白的話我可以解釋一下,this是一個對象,指向當前函數(在JavaScript里函數是對象),然后this[屬性名/方法名] 去調用內部的屬性或方法,那么this[type] (person)就是調用對應的方法去實例化一個具體的類(student或teacher)。通過this[type] (person)去調用。
這就是簡單工廠函數。
抽象工廠模式 :與簡單工廠函數不同的是,抽象工廠函數會先設計好接口,具體的實現在子類中進行。這樣看概念有點模糊,我們來看一個例子:
我們定義一個父類,abstractCreatePerson也就是創建一個人,然后這個人有一個自我介紹的方法方法selfIntroduction,那么不同的人就有不同的介紹內容,這個時候我們就可以用到抽象工廠模式:
var abstractCreatePerson = function () {}; abstractCreatePerson.prototype = { selfIntroduction: function () { throw new Error("請先實例化此方法!"); } } var student = Object.create(abstractCreatePerson.prototype); student.selfIntroduction = function () { console.log("I am a sutdent, my name is holz!"); } student.selfIntroduction(); /* I am a sutdent, my name is holz! */ var teacher = Object.create(abstractCreatePerson.prototype); teacher.selfIntroduction = function () { console.log("I am a teacher, my name is xxxx!"); } teacher.selfIntroduction(); /* I am a teacher, my name is xxxx! */
可以看到這段代碼,父類 abstractCreatePerson 中先聲明了一個方法,然后通過 Object.create() 方法去繼承這個父類,(因為這樣不會覆蓋原有的原型鏈),然后我們再在子類中去實例化方法,不同的子類就有了不同的實例方法。
這就是工廠模式,他提高了我們代碼的可重用性,降低了模塊之間的耦合度。
工廠模式,正像它的名字一樣,可以像工廠一樣生產出我們想要的東西,只要我們提供原料
工廠模式提高了我們代碼的可重用性,降低了模塊之間的耦合度
工廠模式主要用于創建同一類的對象的不同實例
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90337.html
摘要:本回內容介紹上一回聊到單例模式,做了一道題,內容不多,比較容易理解。這里其實還可以進一步優化,達到高聚類低耦合,這里工廠模式就告一段落了。 本回內容介紹 上一回聊到JS單例模式(singleton),做了一道題,內容不多,比較容易理解。介一回嘞,聊聊工廠模式,之前聊到過工廠模式,這回聊深入點兒,可能會比較抽象,不過好在實際開發中使用還算廣泛,理解起來會比較容易,開始咯: 1. 簡單工廠...
摘要:注意事項聲明函數時候處理業務邏輯區分和單例的區別,配合單例實現初始化構造函數大寫字母開頭推薦注意的成本。簡單工廠模式使用一個類通常為單體來生成實例。 @(書籍閱讀)[JavaScript, 設計模式] 常見設計模式 一直對設計模式不太懂,花了一下午加一晚上的時間,好好的看了看各種設計模式,并總結了一下。 設計模式簡介 設計模式概念解讀 設計模式的發展與在JavaScript中的應用 ...
摘要:簡單工廠模式創建單一的對象示例描述工廠模式主要是為了創建對象實例或者類簇抽象工廠關心的是最終產出創建的對象而不關心創建的過程在出現多個類的時候每次創建需要找到對應的類往往比較麻煩這時候通常使用一個函數進行封裝來創建所需要的對象這樣就無需關注 簡單工廠模式(創建單一的對象) 示例1 描述 工廠模式主要是為了創建對象實例或者類簇(抽象工廠), 關心的是最終產出(創建)的對象, 而不關心創建...
摘要:設計模式工廠模式最近閱讀了幾本設計模式方面的書籍學習之余整理下來方便以后的歸納和梳理設計模式工廠模式創造工廠模式是一種創建性模式也就是一種創建對象的最佳實踐首先我們需要理解為什么我們需要工廠模式想象一個場景如果你要求去買一些東西板燒雞腿 Javascript設計模式-工廠模式 最近閱讀了幾本設計模式方面的書籍,學習之余整理下來,方便以后的歸納和梳理 設計模式-工廠模式 創造工廠模式是一...
摘要:簡單工廠模式又叫靜態工廠方法模式,由一個工廠對象決定創建某一種產品對象類的實例。主要用來創建同一類對象。場景一比如體育商店賣體育器材,里面有很多體育用品,及相關介紹,當我們想買一個籃球及相關介紹時,只需要溫售貨員,他會幫你找到所有的東西。 簡單工廠模式又叫靜態工廠方法模式,由一個工廠對象決定創建某一種產品對象類的實例。主要用來創建同一類對象。場景一:比如體育商店賣體育器材,里面有很多體...
閱讀 2410·2021-11-19 09:40
閱讀 3575·2021-10-12 10:12
閱讀 1884·2021-09-22 15:04
閱讀 2898·2021-09-02 09:53
閱讀 762·2019-08-29 11:03
閱讀 1122·2019-08-28 18:11
閱讀 1724·2019-08-23 15:28
閱讀 3580·2019-08-23 15:05