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