摘要:前言設計模式填坑系列,緊接前文距離上次寫筆記又過去了一個多月,我也不知道怎么加班加著加著就一個月了正文定義工廠模式是指提供一個創建對象的接口而不保留具體的創建邏輯,可以根據輸入類型創建對象。
前言
設計模式填坑系列,緊接前文(距離上次寫筆記又過去了一個多月,我也不知道怎么加班加著加著就一個月了-_-!)
正文 定義工廠模式是指提供一個創建對象的接口而不保留具體的創建邏輯,可以根據輸入類型創建對象。讓子類自行決定實例化哪一種工廠類,實際的創建對象過程在子類中進行。在創建相似子類的時候,執行重復操作。(覺得我說的太抽象沒關系,馬上就到舉例子環節)
具體實現前面的描述可能還是稍顯抽象,舉個游戲里面的例子,我們需要實現一個生產游戲角色的RoleMaker工廠,達到以下目的:
var warrior = RoleMaker.factory("warrior")//生產一個戰士 var mage = RoleMaker.factory("mage")//生產一個法師 var priest = RoleMaker.factory("priest")//生產一個牧師 warrior.introduce()// 輸出 "我是一個戰士,我的特長是近戰" mage.introduce()// 輸出 "我是一個法師,我的特長是魔法" priest.introduce()// 輸出 "我是一個牧師,我的特長是治療"
在這里,我們可以看到形如var warrior = RoleMaker.factory("warrior")的語句,就是使用RoleMaker工廠生產了一個戰士的過程,這里的戰士,法師,牧師都是角色的一個子類。
接下來就是如何實現上面的RoleMaker類,最核心的思想還是原型鏈繼承(忘記的同學請自行補課,磨刀不誤砍柴工),具體的實現代碼如下:
//父類 function RoleMaker() { // 這里是父類的屬性 } RoleMaker.introduce = function () { return "我是一個" + this.type + ",我的特長是" + this.specialty } //工廠方法 RoleMaker.prototype.factory = function (type) { var role; // 這里我們直接把子類構造函數都保存在父類的靜態屬性中,這樣的好處是不污染全局命名空間,同時方便查找。實際上當然也可以直接用`switch-case`實現 if (typeof (RoleMaker[type]) !== "function") { //對未指定子類的處理,這里是直接拋出錯誤,也可以為未指定類型做默認值處理 throw { name: "Error", message: type + "does not exist" } } if (typeof (RoleMaker[type].prototype.introduce !== "function")) { // 判斷是否已經實現繼承,注意只繼承一次,當然由于只是原型鏈繼承這里判斷條件也可以用`RoleMaker[type].constructor===RoleMaker` RoleMaker[type].prototype = new RoleMaker() } role = new RoleMaker[type]() //實例化,也就是實際創建對象的過程 return role } // 每個子類的構造函數 RoleMaker.warrior = function () { this.type = "戰士", this.specialty = "近戰" } RoleMaker.mage = function () { this.type = "法師", this.specialty = "魔法" } RoleMaker.priest = function () { this.type = "牧師", this.specialty = "治療" }
以上代碼比較簡單,來回顧下前文說道的幾個特點:
使用者只需要知道特定子類的名稱就可以直接生產對應的子類,無需知道具體實現邏輯
實際的創建對象過程在子類中進行
在創建相似子類的時候,執行重復操作(每個子類只做一次的繼承)
補充一個實例實際上,js的Object()函數,就很符合工廠模式的特征:
var n = Object(1) n.constructor === Number var s = Object("1") n.constructor === String var b = Object(true) n.constructor === Boolean小結
自我感覺設計模式系列由于還是處于學習階段,實踐經驗相對較少,所以寫起來還是偏向于讀書筆記類,所以可能有很多地方都顯得粗糙。權當做先占個坑,等后續有更深入理解再回來補上。
然后慣例感謝之前的熱心讀者,尤其是為我指出錯誤的小伙伴。
然后依然是每次都一樣的結尾,如果內容有錯誤的地方歡迎指出;如果對你有幫助,歡迎點贊和收藏,轉載請征得同意后著明出處,如果有問題也歡迎私信交流,主頁添加了郵箱地址~溜了
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96527.html
摘要:抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。前邊的兩個都是直接生產實例的,開始以為抽象工廠也是但是后來發現抽象工廠更像是生產工廠,其實抽象工廠其實是實現子類繼承父類的方法。 創建型模式 創建型模式是對一個類的實例化過程進行了抽象,把對象的創建和對象的使用進行了分離 上一篇介紹了下單例模式,這一篇介紹一下工廠模式和抽象工廠模式,...
摘要:工廠模式用函數來封裝,以特定接口創建對象的細節。缺點不能知道對象識別的問題對象的類型不知道。復雜的工廠模式定義是將其成員對象的實列化推遲到子類中,子類可以重寫父類接口方法以便創建的時候指定自己的對象類型。 工廠模式 用函數來封裝,以特定接口創建對象的細節。 1.創建對象 function createPerson(name, age, job){ var o = new Obj...
摘要:簡單工廠模式簡單工廠模式又叫靜態工廠模式,由一個工廠對象決定創建某一種產品對象類的實例。工廠方法模式工廠方法模式的本意是將實際創建對象的工作推遲到子類中,這樣核心類就變成了抽象類。抽象工廠模式一般用在 1 什么是工廠模式? 工廠模式是用來創建對象的一種最常用的設計模式。我們不暴露創建對象的具體邏輯,而是將將邏輯封裝在一個函數中,那么這個函數就可以被視為一個工廠。工廠模式根據抽象程度的不...
摘要:簡單工廠模式簡單工廠模式又叫靜態工廠模式,由一個工廠對象決定創建某一種產品對象類的實例。工廠方法模式工廠方法模式的本意是將實際創建對象的工作推遲到子類中,這樣核心類就變成了抽象類。抽象工廠模式一般用在 1 什么是工廠模式? 工廠模式是用來創建對象的一種最常用的設計模式。我們不暴露創建對象的具體邏輯,而是將將邏輯封裝在一個函數中,那么這個函數就可以被視為一個工廠。工廠模式根據抽象程度的不...
閱讀 2567·2021-11-22 13:53
閱讀 4069·2021-09-28 09:47
閱讀 858·2021-09-22 15:33
閱讀 808·2020-12-03 17:17
閱讀 3315·2019-08-30 13:13
閱讀 2121·2019-08-29 16:09
閱讀 1176·2019-08-29 12:24
閱讀 2452·2019-08-28 18:14