最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設計模式中的工廠模式詳解

 更新時間:2023年09月14日 09:21:05   作者:十維豆腦  
這篇文章主要介紹了Java設計模式中的工廠模式詳解,工廠方法模式(Factory?Method?Pattern):創(chuàng)新型模式之一,簡稱工廠模式,通過定義工廠父類負責定義創(chuàng)建對象的公共接口,而子類則負責生成具體的對象,需要的朋友可以參考下

一、定義

工廠方法模式(Factory Method Pattern):創(chuàng)新型模式之一,簡稱工廠模式,通過定義工廠父類負責定義創(chuàng)建對象的公共接口,而子類則負責生成具體的對象

二、UML類圖

在這里插入圖片描述

三、角色職責

  • 抽象產品(Product):它是定義產品的接口,是工廠方法模式所創(chuàng)建對象的超類型,也就是產品對象的公共父類。
  • 具體產品(Concrete Product):它實現了抽象產品接口,某種類型的具體產品由專門的具體工廠創(chuàng)建,具體工廠和具體產品之間一一對應。
  • 抽象工廠(Factory):在抽象工廠類中聲明了工廠方法(Factory Method),用于返回一個產品。抽象工廠是工廠方法模式的核心,所有創(chuàng)建對象的工廠類都必須實現該接口。
  • 具體工廠(Concrete Factory):它是抽象工廠類的子類,實現了在抽象工廠中聲明的工廠方法,并可由客戶端調用,返回一個具體產品類的實例。

四、代碼實現

前言:在簡單工廠模式中,我們每需要增加一個品牌的籃球,就需要修改一次工廠,非常麻煩且復雜,違背了開閉原則。在工廠方法模式中,這個缺陷得到了修復。我們將籃球工廠作為一個抽象工廠,每個品牌的籃球工廠去實現這個抽象工廠,籃球對象的創(chuàng)建由每個工廠去負責,當我們需要新的品牌的籃球時,只需要添加籃球工廠與籃球產品即可,提高了程序的擴展性。

抽象籃球接口(抽象產品類 abstract Product)

public interface BasketBall {
    void shot();
}

阿迪達斯籃球(具體產品類 Concrete Product)

public class AdidasBasketBall implements BasketBall {
    @Override
    public void shot() {
        System.out.println("使用阿迪達斯籃球投籃");
    }
}

耐克籃球(具體產品類 Concrete Product)

public class NikeBasketBall implements BasketBall {
    @Override
    public void shot() {
        System.out.println("使用耐克籃球投籃");
    }
}

斯伯丁籃球(具體產品類 Concrete Product)

public class SpaldingBasketBall implements BasketBall {
    @Override
    public void shot() {
        System.out.println("使用斯伯丁籃球投籃");
    }
}

抽象籃球工廠接口(抽象工廠類 Factory)

public interface BasketBallFactory {
    public BasketBall make();
}

阿迪達斯籃球工廠(具體工廠類 Concrete Factory)

public class AdidasBasketBallFactory implements BasketBallFactory {
    @Override
    public BasketBall make() {
        return new AdidasBasketBall();
    }
}

耐克籃球工廠(具體工廠類 Concrete Factory)

public class NikeBasketBallFactory implements BasketBallFactory {
    @Override
    public BasketBall make() {
        return new NikeBasketBall();
    }
}

斯伯丁籃球工廠(具體工廠類 Concrete Factory)

public class SpaldingBasketBallFactory implements BasketBallFactory {
    @Override
    public BasketBall make() {
        return new SpaldingBasketBall();
    }
}

測試類

public class FactoryMethodTest {
    public static void main(String[] args) {
        // 使用阿迪達斯籃球投籃
        BasketBallFactory adidasBasketBallFactory = new AdidasBasketBallFactory();
        adidasBasketBallFactory.make().shot();
        // 使用耐克籃球投籃
        BasketBallFactory nikeBasketBallFactory = new NikeBasketBallFactory();
        nikeBasketBallFactory.make().shot();
        // 使用斯伯丁籃球投籃
        BasketBallFactory spaldingBasketBallFactory = new SpaldingBasketBallFactory();
        spaldingBasketBallFactory.make().shot();
    }
}

五、源碼分析

工廠方法模式應用的地方非常廣泛,在Spring中就有很多使用了工廠方法模式的地方。

在這里插入圖片描述

其中AbstractApplicationContext就是ApplicationContext接口的實現抽象類。

在這里插入圖片描述

AbstractApplicationContext的子類AbstractRefreshableApplicationContext就實現了這個抽象方法,使用了這個工廠方法去創(chuàng)建了實例。

這樣類的設計與真正的實現之間其實是松耦合的,也正好符合了設計的開閉原則。

六、優(yōu)缺點分析

優(yōu)點

  • 用戶只需要關心所需產品對應的工廠,無需關心創(chuàng)建細節(jié)。
  • 加入新產品 時, 只需要添加一個具體工廠和具體產品 , 提高可擴展性,符合開閉原則。
  • 工廠方法模式中 , 使用工廠類創(chuàng)建產品對象 , 同時隱藏了具體的產品類被實例化的細節(jié) 。

缺點

  • 在添加新產品時 , 除了編寫新的產品類 , 還要編寫該產品類對應的工廠類,增加系統(tǒng)復雜度。

七、適用場景

在日志記錄與訪問的數據庫未知時,會有較多的適用。

客戶端對需要對象的類未知時,抽象工廠類通過其子類來指定創(chuàng)建哪個對象。

通過多態(tài)性,在程序運行時子類覆蓋父類對象,從而使得系統(tǒng)更容易擴展。

八、總結

工廠方法模式中核心的工廠類不再負責對相應子類的創(chuàng)建,而是聲明一個子工廠類必須實現的接口,具體的實例化工作由子工廠類去做,提高了程序的擴展性,符合開閉原則。

但在新增一個新產品時,就要新增一個具體工廠和一個具體產品,會增加代碼量。

工廠方法模式克服了簡單工廠違背開放閉原則的缺點,又保持了封裝對象創(chuàng)建過程的優(yōu)點。

到此這篇關于Java設計模式中的工廠模式詳解的文章就介紹到這了,更多相關Java工廠模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • String?concat(String?str)使用小結

    String?concat(String?str)使用小結

    這篇文章主要介紹了String?concat(String?str)使用小結,在了解concat()之前,首先需要明確的是String的兩點特殊性,一是長度不可變二是值不可變,本文給大家詳細講解,需要的朋友可以參考下
    2022-11-11
  • 詳解Java攔截器以及自定義注解的使用

    詳解Java攔截器以及自定義注解的使用

    這篇文章主要為大家介紹了Java攔截器以及自定義注解的使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2021-12-12
  • springboot實現配置本地訪問端口及路徑

    springboot實現配置本地訪問端口及路徑

    這篇文章主要介紹了springboot實現配置本地訪問端口及路徑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java使用ZipInputStream實現讀取和寫入zip文件

    java使用ZipInputStream實現讀取和寫入zip文件

    zip文檔可以以壓縮格式存儲一個或多個文件,本文主要為大家詳細介紹了java如何使用ZipInputStream讀取Zip文檔與寫入,需要的小伙伴可以參考下
    2023-11-11
  • IDEA Maven Mybatis generator 自動生成代碼(實例講解)

    IDEA Maven Mybatis generator 自動生成代碼(實例講解)

    下面小編就為大家分享一篇IDEA Maven Mybatis generator 自動生成代碼的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • 一文讓你徹底學會Java左移、右移操作

    一文讓你徹底學會Java左移、右移操作

    這篇文章主要介紹了了Java中的位運算符,包括左移(<<)、右移(>>)和無符號右移(>>>),左移將數字的二進制位向左移動,相當于乘以2的n次方;右移將數字的二進制位向右移動,保留符號位,相當于除以2的n次方,文中介紹的非常詳細,需要的朋友可以參考下
    2025-02-02
  • java同一個類中,一個無事務方法調用一個有事務方法時,事務失效問題

    java同一個類中,一個無事務方法調用一個有事務方法時,事務失效問題

    本文詳細介紹了Spring框架中事務管理的實現原理,包括@Transactional注解的使用、事務的開啟、提交和回滾機制,以及代理對象的兩種實現方式(JDK動態(tài)代理和CGLIB代理),文章還探討了在同一個類中調用有事務方法時事務失效的原因,并提供了解決方法
    2024-12-12
  • Java中Integer和int的區(qū)別解讀

    Java中Integer和int的區(qū)別解讀

    這篇文章主要介紹了Java中Integer和int的區(qū)別解讀,大家都知道他可以表示一個整數,而且也知道可以表示整數的還有int,只是使用Integer的次數要比int多得多,今天我們就來好好探究一下Integer與int的區(qū)別以及更深處的知識,需要的朋友可以參考下
    2023-12-12
  • Springboot集成Mybatis-plus、ClickHouse實現增加數據、查詢數據功能

    Springboot集成Mybatis-plus、ClickHouse實現增加數據、查詢數據功能

    本文給大家講解Springboot + mybatis-plus 集成ClickHouse,實現增加數據、查詢數據功能,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Java通過賣票理解多線程

    Java通過賣票理解多線程

    本文主要介紹了一個多線程賣票的例子,通過賣票這個實例來介紹多線程的方式,加深理解,需要的朋友可以參考下
    2017-09-09

最新評論

洛隆县| 稷山县| 安泽县| 赤壁市| 塘沽区| 黄梅县| 文成县| 灵川县| 来凤县| 峨山| 长宁区| 邢台县| 辽中县| 土默特右旗| 安阳县| 淄博市| 武汉市| 卫辉市| 天津市| 荆门市| 佳木斯市| 巴林左旗| 绥滨县| 江门市| 根河市| 荃湾区| 墨江| 太仓市| 合山市| 武穴市| 锡林浩特市| 谷城县| 娄底市| 沧源| 通州区| 休宁县| 织金县| 理塘县| 小金县| 凉山| 赤峰市|