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