摘要:官方解釋工廠是構(gòu)造方法的抽象,抽象了創(chuàng)建具體對(duì)象的過程。工廠方法模式的實(shí)質(zhì)是定義一個(gè)創(chuàng)建對(duì)象的接口,但讓實(shí)現(xiàn)這個(gè)接口的類來(lái)決定實(shí)例化哪個(gè)類。
前言
上一章回顧了JS對(duì)象的屬性類型,那么除了我們常用的new Object()構(gòu)造函數(shù)創(chuàng)建對(duì)象和字面量方式創(chuàng)建對(duì)象的方式外,還需要用到更多的模式來(lái)解決對(duì)象被多次復(fù)用的問題。什么意思呢?就是我們很有可能會(huì)在各個(gè)地方去使用已經(jīng)創(chuàng)建過的對(duì)象,但是對(duì)象里的屬性值有可能是不同的。舉個(gè)例子:
let obj = { name:"勾鑫宇", age:18, myName:function(){ console.log(this.name) } }
如果我們想繼續(xù)使用這個(gè)obj對(duì)象,但里面的屬性值需要改變,我們可能會(huì)想到這樣做:
let obj2 = obj; obj2.name = "張三";
但是這樣做有一個(gè)問題,由于JS中引用類型的機(jī)制,當(dāng)你修改obj2的同時(shí),obj也被改變了。所以我們就不得不像下面這樣再重新創(chuàng)建一個(gè)obj2對(duì)象。
let obj2 = { name:"張三", age:23, myName:function(){ console.log(this.name) } }
這樣就無(wú)形中給我們?cè)黾恿撕芏喙ぷ鳎a量也會(huì)大大增加,而這么多重復(fù)的東西是完全沒必要的。于是我們就需要用到創(chuàng)建對(duì)象的各種設(shè)計(jì)模式來(lái)解決這個(gè)問題了,這章先講工廠模式。
工廠模式根據(jù)書上和各種百科的解釋,還是先來(lái)一個(gè)官方版本,然后寫寫我的理解吧。
官方解釋:
工廠是構(gòu)造方法的抽象,抽象了創(chuàng)建具體對(duì)象的過程。工廠方法模式的實(shí)質(zhì)是“定義一個(gè)創(chuàng)建對(duì)象的接口,但讓實(shí)現(xiàn)這個(gè)接口的類來(lái)決定實(shí)例化哪個(gè)類。工廠方法讓類的實(shí)例化推遲到子類中進(jìn)行。
工廠模式分為三類:簡(jiǎn)單工廠模式、工廠方法模式和抽象工廠模式
我的理解:
至于為什么要叫工廠模式,就是因?yàn)檫@個(gè)模式將我們所需要的邏輯代碼給封裝到了一個(gè)函數(shù)里面,然后我們只需要傳入相應(yīng)的參數(shù),就能夠去獲取需要的結(jié)果。這個(gè)過程就如同我們向工廠要東西一樣簡(jiǎn)單。比如我們需要一臺(tái)電腦,只需要告訴工廠電腦的屏幕尺寸是多大、系統(tǒng)是Win還是Linux、內(nèi)存是多少G,而不用關(guān)心屏幕是怎么制作的,系統(tǒng)是怎么設(shè)置的,內(nèi)存條是怎么做的,最重要的是最終這個(gè)電腦是怎么組裝出來(lái)的我們也不關(guān)心,只關(guān)心最后能拿到一臺(tái)我們所需的成品電腦就行了。
由于《JS高編》里這一部分只講了簡(jiǎn)單工廠模式的實(shí)現(xiàn),其他兩種模式就先不說,更多的可以去看《JS設(shè)計(jì)模式》。
//創(chuàng)建一個(gè)簡(jiǎn)單函數(shù),就當(dāng)作一個(gè)類 //第一種方式是通過new Object()創(chuàng)建對(duì)象,最后返回它 function person(name,age){ let o = new Object(); o.name = name; o.age = age; o.myName = function(){ console.log("我的名字是"+o.name) } return o; } let person1 = person("勾鑫宇",18); let person2 = person("張三",23); person1.myName();//輸出“我的名字是勾鑫宇” person2.age;//輸出23 //第二種方式是通過字面量形式創(chuàng)建對(duì)象 function person(name,age){ let o = { name: name; age: age; myName: function(){ console.log("我的名字是"+o.name) } } return o; }
上面的方法使用簡(jiǎn)單工廠模式封裝了一個(gè)類,然后我們只需要傳入名字和年齡的參數(shù)就行了。那么我們還可以添加稍微復(fù)雜一點(diǎn)的邏輯在這個(gè)工廠里面。
function person(name,age,country){ let o = { name: name, age:age, myName:function(){ console.log("我的名字是" + o.name) }, country:country, type:"" } if(age > 18 && country !== "China"){ o.type = "成年人"; console.log("允許進(jìn)入該網(wǎng)站") } else if(age < 18 ){ o.type = "未成年"; console.log("不允許進(jìn)入該網(wǎng)站") } else { o.type = "成年人"; console.log("不允許進(jìn)入該網(wǎng)站") } return o } let person1 = person("李四",20,"Japan");//輸出“允許進(jìn)入該網(wǎng)站” let person2 = person("張三",17,"Japan");//輸出“不允許進(jìn)入該網(wǎng)站” let person3 = person("王五",23,"China");//輸出“不允許進(jìn)入該網(wǎng)站”優(yōu)點(diǎn)
簡(jiǎn)單工廠模式的優(yōu)點(diǎn)很明顯,就是將我們的邏輯代碼都封裝好了,最終只暴露出一個(gè)公共的接口讓我們傳入?yún)?shù)即可使用。這種方式極大地減少了代碼量,提高了代碼的復(fù)用性。同時(shí)使得我們能夠根據(jù)不同的條件去創(chuàng)造不同的工廠,最終獲得不同的產(chǎn)品。
缺點(diǎn)這種模式的缺點(diǎn)也是很明顯的,因?yàn)槲覀儚?fù)雜的邏輯都封裝在了函數(shù)里,一旦某處出現(xiàn)了邏輯錯(cuò)誤,就會(huì)影響所有使用這個(gè)工廠的人,可以說是牽一發(fā)而動(dòng)全身。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/103982.html
摘要:強(qiáng)大的表單驗(yàn)證前端掘金支持非常強(qiáng)大的內(nèi)置表單驗(yàn)證,以及。面向?qū)ο蠛兔嫦蜻^程的區(qū)別的種設(shè)計(jì)模式全解析后端掘金一設(shè)計(jì)模式的分類總體來(lái)說設(shè)計(jì)模式分為三大類創(chuàng)建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。 強(qiáng)大的 Angular 表單驗(yàn)證 - 前端 - 掘金Angular 支持非常強(qiáng)大的內(nèi)置表單驗(yàn)證,maxlength、minlength、required 以及 patt...
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊?,否則只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:我們通過一個(gè)簡(jiǎn)單的例子與圖示,來(lái)了解構(gòu)造函數(shù),實(shí)例與原型三者之間的關(guān)系。而原型對(duì)象的指向構(gòu)造函數(shù)。于是根據(jù)構(gòu)造函數(shù)與原型的特性,我們就可以將在構(gòu)造函數(shù)中,通過聲明的屬性與方法稱為私有變量與方法,它們被當(dāng)前被某一個(gè)實(shí)例對(duì)象所獨(dú)有。 showImg(https://segmentfault.com/img/remote/1460000008593382); 如果要我總結(jié)一下學(xué)習(xí)前端以來(lái)我遇...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
閱讀 3005·2023-04-26 02:22
閱讀 2349·2021-11-17 09:33
閱讀 3247·2021-09-22 16:06
閱讀 1159·2021-09-22 15:54
閱讀 3596·2019-08-29 13:44
閱讀 2019·2019-08-29 12:37
閱讀 1372·2019-08-26 14:04
閱讀 1975·2019-08-26 11:57