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