Java 设计模式之静态工厂方法模式
設(shè)計模式系列
創(chuàng)建型設(shè)計模式
Java 設(shè)計模式之單例模式
Java 設(shè)計模式之靜態(tài)工廠方法模式
Java 設(shè)計模式之工廠方法模式
Java 設(shè)計模式之抽象工廠模式
Java 設(shè)計模式之Builder模式
Java 設(shè)計模式之靜態(tài)工廠、工廠方法、抽象工廠和 Builder 模式的區(qū)別
結(jié)構(gòu)型設(shè)計模式
Java 設(shè)計模式之代理模式
Java 設(shè)計模式之外觀模式
文章目錄
- 設(shè)計模式系列
- 創(chuàng)建型設(shè)計模式
- 結(jié)構(gòu)型設(shè)計模式
- 寫在前面
- 定義
- 示例
- 場景
- UML類圖
- 程序代碼
- 總結(jié)
- 感謝
寫在前面
先來一個遲到的祝福,祝大家中秋節(jié)快樂!應(yīng)個景吧,工廠模式系列的例子和代碼,將以 “月餅” 為主題進(jìn)行。
工廠模式細(xì)分起來,分為三種:靜態(tài)工廠方法模式、工廠方法模式、抽象工廠方法模式。本文我們先來了解最簡單的靜態(tài)工廠方法模式。
定義
靜態(tài)工廠方法模式,又稱為 簡單工廠模式,屬于創(chuàng)建型設(shè)計模式,但不屬于 GOF 提出的 23 種設(shè)計模式之一。這種形式的工廠模式,是最常用,也最簡單、最容易理解的工廠模式,其是由一個工廠類對象決定創(chuàng)建哪一種產(chǎn)品類的實(shí)例。
示例
場景
來我們來考慮一個場景:
1、小A有一家月餅工廠,叫做 MooncakesFactory
2、月餅有 五仁月餅 FiveKernel 、豆沙月餅 Beansand 等
3、我們抽象出月餅的產(chǎn)品抽象類 Mooncakes ,擁有“吃”的行為(當(dāng)然,應(yīng)該是人吃月餅,而不是月餅吃自己,這里為了好理解,就將吃的行為賦給了月餅)。
4、當(dāng)想要某種類型的月餅時,通過工廠類得到相應(yīng)的月餅類即可進(jìn)行生產(chǎn)
UML類圖
讓我來看下它們的 UML 類圖吧,如圖 1 :
程序代碼
下面我們閱讀下程序代碼。
程序清單 1 ????月餅的產(chǎn)品抽象類 Mooncakes public abstract class Mooncakes{abstract void eat(); }
可以看到,抽象類 Mooncakes 簡單的抽象了一種行為,就是吃月餅 eat()。
下面我們來看下工廠類的代碼:
當(dāng)想要某種類型的月餅時,通過工廠類得到相應(yīng)的月餅類,即可開始生產(chǎn)。
這就通過工廠,實(shí)現(xiàn)了對產(chǎn)品類實(shí)例的管理。
那么,如果有了一種的新的月餅類型,比如蛋黃月餅,那么我們需要擴(kuò)展一個新類 Yolk 繼承抽象產(chǎn)品類 Mooncakes,同時還需要對工廠類 MooncakesFactory 進(jìn)行修改,以便適應(yīng)新的月餅類型(int type)。
我們知道,我們的程序應(yīng)該“ 面向擴(kuò)展開放,面向修改關(guān)閉 ”,我們對工廠類的修改自然是不符合" 開閉原則 " 的,讓我們用反射對工廠類進(jìn)行優(yōu)化吧:
程序清單 5 ????用反射優(yōu)化月餅工廠類 MooncakesFactory public class MooncakesFactory {public static <T extends Mooncakes> T makeMooncakes(Class<T> clz) {Mooncakes mooncakes = null;try {mooncakes = (Mooncakes) Class.forName(clz.getName()).newInstance();} catch (Exception e) {e.printStackTrace();}return (T) mooncakes;}}
這樣,無論我們擴(kuò)展多少種月餅類型,只需要將相應(yīng)的月餅類注入工廠的 makeMooncakes() 方法即可,不需要再對工廠類的代碼進(jìn)行修改。
最后,我們在主函數(shù)中調(diào)用工廠得到月餅類的實(shí)例,即可開始生產(chǎn)。
程序清單 6 ????工廠生產(chǎn)產(chǎn)品實(shí)例??進(jìn)行產(chǎn)品生產(chǎn) public class Main {public static void main(String[] args) {MooncakesFactory.makeMooncakes(FiveKernel.class).eat();MooncakesFactory.makeMooncakes(Beansand.class).eat();}}
結(jié)果示例,如圖 2 : 圖 2????生產(chǎn)月餅??吃掉月餅
總結(jié)
至此,靜態(tài)工廠方法模式基本就聊完了。
大家會發(fā)現(xiàn),這種模式十分簡單,優(yōu)點(diǎn)也是十分明顯:
用戶只需要關(guān)心自己想要什么類型的產(chǎn)品對象,而對產(chǎn)品對象的創(chuàng)建過程無須關(guān)心,全部交給工廠來做,降低了用戶與產(chǎn)品類的耦合,也便于對產(chǎn)品的類型進(jìn)行擴(kuò)展。
然而,正如前文所說,“ 靜態(tài)工廠方法模式 ” 不屬于 GOF 提出的 23 種設(shè)計模式之一,“ 工廠方法模式 ” 則包含其中,讓我們移步下一講,一起學(xué)習(xí)下 Java 設(shè)計模式之工廠方法模式 吧!
另外,源碼也有放在 Gihub 上:StaticFactoryPattern
感謝
- 《Android源碼設(shè)計模式解析與實(shí)戰(zhàn)》 何紅輝 關(guān)愛民
- 《Android進(jìn)階之光》 劉望舒
總結(jié)
以上是生活随笔為你收集整理的Java 设计模式之静态工厂方法模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Android 博客gif图片制作》
- 下一篇: 【实战】使用Java结合Sendmail