23种设计模式之工厂模式学习笔记
什么是工廠模式?
工廠顧名思義就是創建產品,根據產品是具體產品還是具體工廠可分為簡單工廠模式和工廠方法模式,根據工廠的抽象程度可分為工廠方法模式和抽象工廠模式。該模式用于封裝和管理對象的創建,是一種創建型模式。本文從一個具體的例子逐步深入分析,來體會三種工廠模式的應用場景和利弊。
1、簡單工廠模式
什么是簡單工廠模式?
簡單工廠也叫做靜態工廠,在程序編譯成字節碼文件前就已經確立了工廠類對一些對象的封裝關系,只需要根據參數來獲取工廠對象來獲取對應的目標對象。
優點:
- 客戶端創建對象時只需要記住特定的參數,而不需要記住復雜的類名,也不用關注實現的過程。(實現了封裝和部分解耦)
- 創建對象不需要單獨實例化,而是通過工廠類直接獲取示例(實現復用)
缺點:
- 實例化對象的邏輯全部封裝在一個工廠類里,每次需求變化都要單獨修改工廠類(違反了開閉原則)。
- 不方便擴展子類
應用場景:
適合應用于業務簡單產品較少且一旦創建完成不會再發生修改的情況
簡單工廠邏輯結構圖:
AbstractProduct: 抽象工廠就是把Product所有共性的方法抽取出來成為一個抽象類。
Product: 就是具體的產品類,拿手機來舉例的話,那么ProductA好比就是蘋果手機,ProductB就好比小米手機。
Factory: 就是對應Product的代工廠對象,工廠類,根據上面的舉例對象來說,那么此時Factory就好比如富士康工廠,加工各種品牌的手機,可通過選擇來選取加工不同品牌的手機。
具體實現:
接口Phone
👇
具體實現類IPone
👇
具體實現類MiPhone
👇
工廠類PhoneFactory
👇
啟動類
👇
具體結果
👇
2、工廠方法模式
什么是工廠方法模式?
在現實生活中社會分工越來越細,越來越專業化,各種產品有專門的工廠生產,而不是像富士康一樣包含了其他手機廠商的生產業務,而是每一個品牌都有自己的生產工廠。工廠方法模式是對簡單工廠模式的進一步抽象化,其好處是可以使系統在不修改原來代碼的情況下引進新的產品,即滿足開閉原則。
優點:
- 用戶只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體創建過程。
- 靈活性增強,對于新產品的創建,只需多寫一個相應的工廠類。
- 典型的解耦框架。高層模塊只需要知道產品的抽象類,無須關心其他實現類,滿足迪米特法則、依賴倒置原則和里氏替換原則。
缺點:
- 類的個數容易過多,增加復雜度,增加了系統的抽象性和理解難度。
- 抽象產品只能生產一種產品。
使用場景:
- 客戶只知道創建產品的工廠名,而不知道具體的產品名
- 創建對象的任務由多個具體子工廠中的某一個完成,而抽象工廠只提供創建產品的接口。
- 客戶不關心創建產品的細節,只關心產品的品牌。
工廠方法邏輯結構圖:
AbstractProduct: 抽象的產品,抽取出該類產品共有的方法。
Product1: 具體的產品類,具體的產品生產細節在內部實現,比如IPhone。
Product2: 具體的產品類,具體的產品生產細節在內部實現,比如MiPhone。
AbstractFactory: 抽象工廠,抽取處所有工廠創建同一類產品的方法。
ConcreteFactory1: 具體的工廠類,一個工廠只能生產一類產品,比如IPhoneFactory工廠只能生產IPhone,MiPhoneFactory只能生產MiPhone。如果需要生產其他產品怎么辦?此時只需要添加一個具體的產品類和對應的工廠即可。
ConcreteFactory2: 如上。
具體實現:
//抽象產品 public interface Phone {void makePhone(); } //具體產品IPhone class IPhone implements Phone{@Overridepublic void makePhone() {System.out.println("生產蘋果手機");} } //具體產品MiPhone class MiPhone implements Phone {@Overridepublic void makePhone() {System.out.println("生產小米手機");} } //抽象工廠具有生產產品的方法 interface AbstractFactory {public Phone createPhone(); } //具體的蘋果工廠 class IPhoneFactory implements AbstractFactory {@Overridepublic Phone createPhone() {return new IPhone();} } //具體的小米工廠 class MiPhoneFactory implements AbstractFactory {@Overridepublic Phone createPhone() {return new MiPhone();} }public class Test_gongchang {public static void main(String[] args) {IPhoneFactory iPhoneFactory = new IPhoneFactory();Phone phone = iPhoneFactory.createPhone();phone.makePhone();MiPhoneFactory miPhoneFactory = new MiPhoneFactory();Phone phone1 = miPhoneFactory.createPhone();phone1.makePhone();} }結果如下:
👇
3、抽象工廠模式
什么是抽象工廠模式?
上面兩種模式不管工廠怎么拆分抽象,都只是針對一類產品Phone。工廠方法模式引入工廠等級結構,解決了簡單工廠模式中工廠類職責過重的問題,但由于工廠方法模式中每個工廠只創建一類具體類的對象,這將會導致系統當中的工廠類過多,這勢必會增加系統的開銷。此時,我們可以考慮將一些相關的具體類組成一個“具體類族”,由同一個工廠來統一生產,這就是我們本文要說的“抽象工廠模式”的基本思想。
優點:
- 增加新的產品等級很方便, 無須修改已有系統, 符合“開閉原則”。
- 分離了具體的類。客戶通過抽象接口操縱實例,產品的類名也在具體工廠的實現中被分離,它們不出現在客戶代碼中。
缺點:
- 增加新的產品族結構麻煩, 需要對原有系統進行較大的修改, 甚至需要修改抽象層代碼,這顯然會帶來較大的不便, 違背了“開閉原則”。因為抽象工廠接口確定了可以被創建的產品集合,所以難以擴展抽象工廠以生產新種類的產品。
應用場景:
- 一系列相關產品對象(屬于同一產品族)一起創建時需要大量的重復代碼
- 提供一個產品類的庫,所有的產品以同樣的接口出現,從而使得客戶端不依賴于具體的實現。
Attentions: 看到這里的朋友可能不太理解產品族和產品等級的概念。
注意它要來了!!!
產品等級: 產品等級即產品的繼承結構,比如一個電視機的抽象類,其子類由海爾電視機、海信電視機、長虹電視機,抽象電視機與具體品牌的電視機形成了一個產品等級。
產品族: 在抽象工廠模式中,產品族是指由同一個工廠生產,但位于不同產品等級中的一組產品。如海爾電器工廠生產的海爾電視機、海爾電冰箱,海爾電視機位于電視機產品等級結構中,海爾電冰箱位于電冰箱產品等級結構中,海爾電視機、海爾電冰箱構成了一個產品族。
具體可參考:https://blog.csdn.net/w405722907/article/details/87798453
抽象工廠模式邏輯結構
AbstractPhone: 手機的抽象類,抽取手機的公共方法。
AbstractPC: 電腦PC端的抽象類,抽取手機的公共方法。
MiPhone和IPhone: 具體的手機實現類,屬于不同產品族。
MiPC和MAC: 具體的電腦實現類,屬于不同的產品族,但是MiPC和MiPhone屬于同一產品組不同的產品級。MAC和IPone屬于同一產品組不同的產品級。
AbstractFactory: 抽象工廠,抽取處創建具體產品的公共方法。
MiFactory和AppleFactory: 具體的工廠實現類,一個品牌工廠就是一個產品族。
具體實現
👇
//抽象的產品 interface Phone {void makePhone(); } //電腦接口 interface Computer {void makeComputer(); } //具體的產品類 class IPhone implements Phone {public IPhone() {this.makePhone();}@Overridepublic void makePhone() {System.out.println("蘋果工廠生產蘋果手機");} } //具體的產品類 class Mac implements Computer {public Mac() {this.makeComputer();}@Overridepublic void makeComputer() {System.out.println("蘋果工廠生產MAC");} } //具體的產品類和上面的產品屬于不同的族 class MiComputer implements Computer {public MiComputer() {this.makeComputer();}@Overridepublic void makeComputer() {System.out.println("小米工廠生產筆記本電腦");} } //具體的產品類和MiComputer屬于同一產品族 class MiPhone implements Phone {public MiPhone() {this.makePhone();}@Overridepublic void makePhone() {System.out.println("小米工廠生產小米手機");} } //抽象工廠,抽取不同產品族的共性 interface AbstractFactory {Phone createPhone();Computer createComputer(); } //具體的品牌工廠,一個品牌的所有展品就是一個產品族 class AppleFactory implements AbstractFactory {@Overridepublic Phone createPhone() {return new IPhone();}@Overridepublic Computer createComputer() {return new Mac();} } //具體的品牌工廠 class MiFactory implements AbstractFactory {@Overridepublic Phone createPhone() {return new MiPhone();}@Overridepublic Computer createComputer() {return new MiComputer();} }public class Testttt {public static void main(String[] args) {AppleFactory appleFactory = new AppleFactory();appleFactory.createComputer();appleFactory.createPhone();MiFactory miFactory = new MiFactory();miFactory.createComputer();miFactory.createPhone();} }運行結果
👇
總結
以上是生活随笔為你收集整理的23种设计模式之工厂模式学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022全新Ripro日主题V9.0升级
- 下一篇: 详解设计模式:工厂方法模式