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