日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java 设计模式之静态工厂方法模式

發(fā)布時間:2024/1/1 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 设计模式之静态工厂方法模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

設(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????靜態(tài)工廠方法模式 示例的 UML 類圖

程序代碼

下面我們閱讀下程序代碼。


程序清單 1 ????月餅的產(chǎn)品抽象類 Mooncakes public abstract class Mooncakes{abstract void eat(); }

可以看到,抽象類 Mooncakes 簡單的抽象了一種行為,就是吃月餅 eat()。



程序清單 2 ????五仁月餅 實(shí)現(xiàn)類 FiveKernel public class FiveKernel extends Mooncakes{@Overridepublic void eat() {System.out.println("吃一個五仁月餅");}}



程序清單 3 ????豆沙月餅 實(shí)現(xiàn)類 Beansand public class Beansand extends Mooncakes{@Overridepublic void eat() {System.out.println("吃一個豆沙月餅");}}




下面我們來看下工廠類的代碼:

程序清單 4 ????月餅工廠類 MooncakesFactory public class MooncakesFactory {public static Mooncakes makeMooncakes(String type) {Mooncakes mooncakes = null;switch (type) {case "FiveKernel":mooncakes = new FiveKernel();break;case "Beansand":mooncakes = new Beansand();break;}return mooncakes;}}

當(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。