摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設(shè)計(jì)模式之一。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
參考文章:
深入理解java三種工廠模式
工廠模式,工廠方法模式,抽象工廠模式 詳解
工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計(jì)模式之一。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
在工廠模式中,我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶端暴露創(chuàng)建邏輯,并且是通過(guò)使用一個(gè)共同的接口來(lái)指向新創(chuàng)建的對(duì)象。
工廠模式根據(jù)工廠抽象級(jí)別分為三種:
1、簡(jiǎn)單工廠模式
2、工廠方法模式
3、抽象工廠模式
工廠模式的角色一般有以下幾個(gè):
1、抽象工廠類(lèi)(注:簡(jiǎn)單工廠無(wú)此類(lèi))
2、具體工廠類(lèi)
3、抽象產(chǎn)品類(lèi)
4、具體產(chǎn)品類(lèi)
class BMW { drive() { console.log("drive bmw..."); } } class Benz { drive() { console.log("drive Benz..."); } } class Factory { getBMWCar() { return new BMW(); } getBenzCar() { return new Benz(); } } var f1 = new Factory(); f1.getBMWCar().drive(); f1.getBenzCar().drive();
當(dāng)需要添加一類(lèi)產(chǎn)品時(shí),需要在工廠里添加對(duì)應(yīng)的生產(chǎn)邏輯,違背了開(kāi)閉原則,簡(jiǎn)單工廠模式只在非常簡(jiǎn)單的情況下使用。
工廠方法模式由于簡(jiǎn)單工廠的弊端明顯,更多時(shí)候使用到的是工廠方法模式,工廠方法模式把生產(chǎn)過(guò)程下放到派生類(lèi),所以當(dāng)添加一類(lèi)產(chǎn)品的時(shí)候只需添加一個(gè)工廠,擴(kuò)展性增強(qiáng)。
注:由于JS沒(méi)有接口也沒(méi)有抽象類(lèi)的說(shuō)法,用以下的形式模擬。
class FactoryInterface { constructor() { if (Object.getPrototypeOf(this) === FactoryInterface.prototype) { throw new Error("該類(lèi)是抽象類(lèi),無(wú)法實(shí)例化") } } getCar() { throw new Error("派生類(lèi)必須實(shí)現(xiàn)該方法,抽象函數(shù)無(wú)法直接調(diào)用!"); } } class BMWFactory extends FactoryInterface { getCar() { return new BMW(); } } class BenzFactory extends FactoryInterface { getCar() { return new Benz(); } } var bmwF = new BMWFactory(); var benzF = new BenzFactory(); bmwF.getCar().drive(); benzF.getCar().drive();抽象工廠模式
抽象工廠模式的用意為:給客戶端提供一個(gè)接口,可以創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象。而且使用抽象工廠模式還要滿足以下條件:
1.系統(tǒng)中有多個(gè)產(chǎn)品族,而系統(tǒng)一次只可能消費(fèi)其中一族產(chǎn)品
2.同屬于同一個(gè)產(chǎn)品族的產(chǎn)品以其使用。
舉個(gè)例子,寶馬和奔馳兩個(gè)牌子都有越野車(chē)和商務(wù)車(chē),寶馬系的是一個(gè)產(chǎn)品族,奔馳系的也是一個(gè)產(chǎn)品族,每個(gè)產(chǎn)品族下面都有相類(lèi)似的產(chǎn)品。
class SportsCar { constructor() { if (Object.getPrototypeOf(this) === SportsCar.prototype) { throw new Error("該類(lèi)是抽象類(lèi),無(wú)法實(shí)例化") } } crossCountry() { throw new Error("派生類(lèi)必須實(shí)現(xiàn)該方法,抽象函數(shù)無(wú)法直接調(diào)用!"); } } class BussinessCar { constructor() { if (Object.getPrototypeOf(this) === BussinessCar.prototype) { throw new Error("該類(lèi)是抽象類(lèi),無(wú)法實(shí)例化") } } talkBusiness() { throw new Error("派生類(lèi)必須實(shí)現(xiàn)該方法,抽象函數(shù)無(wú)法直接調(diào)用!"); } } class BMWSportsCar extends SportsCar { crossCountry() { console.log("寶馬去越野"); } } class BenzSportsCar extends SportsCar { crossCountry() { console.log("奔馳去越野"); } } class BMWBussinessCar extends BussinessCar { talkBusiness() { console.log("寶馬去談生意"); } } class BenzBussinessCar extends BussinessCar { talkBusiness() { console.log("奔馳去談生意"); } } class AbstractFactory { constructor() { if (Object.getPrototypeOf(this) === AbstractFactory.prototype) { throw new Error("該類(lèi)是抽象類(lèi),無(wú)法實(shí)例化") } } getSportsCar() { throw new Error("派生類(lèi)必須實(shí)現(xiàn)該方法,抽象函數(shù)無(wú)法直接調(diào)用!"); } getBussinessCar() { throw new Error("派生類(lèi)必須實(shí)現(xiàn)該方法,抽象函數(shù)無(wú)法直接調(diào)用!"); } } class BMWSoleFactory extends AbstractFactory { getSportsCar() { return new BMWSportsCar(); } getBussinessCar() { return new BMWBussinessCar(); } } class BenzSoleFactory extends AbstractFactory { getSportsCar() { return new BenzSportsCar(); } getBussinessCar() { return new BenzBussinessCar(); } } var benf2 = new BenzSoleFactory(); var bmwf2 = new BMWSoleFactory(); benf2.getSportsCar().crossCountry(); benf2.getBussinessCar().talkBusiness(); bmwf2.getSportsCar().crossCountry(); bmwf2.getBussinessCar().talkBusiness();
小結(jié):
工廠模式的作用是解耦了產(chǎn)品的生產(chǎn)和使用部分,讓使用需要的產(chǎn)品的時(shí)候只需要調(diào)用對(duì)應(yīng)的接口即可,減少冗余代碼。
優(yōu)點(diǎn):1、隱藏了生產(chǎn)過(guò)程,只需調(diào)用相應(yīng)接口;2、擴(kuò)展性好,當(dāng)需要添加一類(lèi)產(chǎn)品時(shí),只需添加對(duì)應(yīng)工廠類(lèi)即可。
與建造者模式區(qū)別:工廠模式不需要客戶端關(guān)心構(gòu)建過(guò)程,只需要了解產(chǎn)品對(duì)應(yīng)的工廠即可;建造者模式更多的是構(gòu)建擁有復(fù)雜的內(nèi)部結(jié)構(gòu)的對(duì)象,過(guò)程由Derector控制。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/93845.html
摘要:參考文章設(shè)計(jì)模式之建造者模式一什么是建造者模式建造者模式是將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。 參考文章:java設(shè)計(jì)模式之建造者模式 一、什么是建造者模式建造者模式:是將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。工廠類(lèi)模式提供的是創(chuàng)建單個(gè)類(lèi)的模式,而建造者模式則是將各種產(chǎn)品集中起來(lái)進(jìn)行管理,用來(lái)創(chuàng)建復(fù)合對(duì)象,所謂...
摘要:連接郵件服務(wù)器的類(lèi)可以連接郵件服務(wù)器的方法有,此時(shí)可以寫(xiě)一個(gè)工廠類(lèi)負(fù)責(zé)實(shí)例化這幾種連接方法,如果某一天對(duì)方增加了連接方法,那么直接在工廠類(lèi)里做相應(yīng)的修改即可。擴(kuò)展性高,如果想增加一個(gè)產(chǎn)品,只要擴(kuò)展一個(gè)工廠類(lèi)或者是修改工廠的生產(chǎn)過(guò)程即可。 定義 工廠模式的使用頻率比較高。它的定義為:定義一個(gè)類(lèi),該類(lèi)主要負(fù)責(zé)系統(tǒng)的去實(shí)例化一些其它的類(lèi)。通俗點(diǎn)說(shuō)就是,你告訴我你需要哪個(gè)類(lèi)的實(shí)例即可,其它的你...
摘要:的設(shè)計(jì)模式有很多種,本文取最簡(jiǎn)單的三種模式工廠模式單例模式和注冊(cè)樹(shù)模式進(jìn)行簡(jiǎn)單的講解。文件創(chuàng)建完后,咱們回到單元測(cè)試文件文件再執(zhí)行一下單元測(cè)試命令發(fā)現(xiàn),也能返回成功,這樣的話我們就能很方便的修改任何驅(qū)動(dòng)了。 php 設(shè)計(jì)模式之工廠模式、單例模式、注冊(cè)樹(shù)模式 在軟件工程中,創(chuàng)建型設(shè)計(jì)模式承擔(dān)著對(duì)象創(chuàng)建的職責(zé),嘗試創(chuàng)建適合程序上下文的對(duì)象,對(duì)象創(chuàng)建設(shè)計(jì)模式的產(chǎn)生是由于軟件工程設(shè)計(jì)的問(wèn)題,具...
摘要:孫臏心里一萬(wàn)個(gè)草泥馬在奔騰,差點(diǎn)沒(méi)噎死自己滾一邊去,我們這盤(pán)跟他賽馬開(kāi)始,策略模式上場(chǎng)。在設(shè)計(jì)模式之禪中的提出通過(guò)策略枚舉和反射機(jī)制對(duì)策略模式進(jìn)行改良,膜拜了但是要添加或淘汰策略,還是得去對(duì)枚舉進(jìn)行修改,也不符合開(kāi)閉原則。 今天給大家說(shuō)說(shuō)田忌賽馬的故事。如有雷同,純屬巧合!話說(shuō)在戰(zhàn)國(guó)時(shí)期,群雄割據(jù),硝煙四起,茶余飯后還是少不了娛樂(lè)活動(dòng)的,其中賽馬是最火爆的。一天,孫臏看到田忌像個(gè)死雞似...
閱讀 2117·2021-11-24 09:39
閱讀 903·2021-09-30 09:48
閱讀 1072·2021-09-22 15:29
閱讀 2495·2019-08-30 14:17
閱讀 1942·2019-08-30 13:50
閱讀 1428·2019-08-30 13:47
閱讀 1050·2019-08-30 13:19
閱讀 3473·2019-08-29 16:43