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