欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設(shè)計模式中的工廠模式詳解

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

一、定義

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

二、UML類圖

在這里插入圖片描述

三、角色職責(zé)

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

四、代碼實現(xiàn)

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

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

public interface BasketBall {
    void shot();
}

阿迪達(dá)斯籃球(具體產(chǎn)品類 Concrete Product)

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

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

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

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

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

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

public interface BasketBallFactory {
    public BasketBall make();
}

阿迪達(dá)斯籃球工廠(具體工廠類 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) {
        // 使用阿迪達(dá)斯籃球投籃
        BasketBallFactory adidasBasketBallFactory = new AdidasBasketBallFactory();
        adidasBasketBallFactory.make().shot();
        // 使用耐克籃球投籃
        BasketBallFactory nikeBasketBallFactory = new NikeBasketBallFactory();
        nikeBasketBallFactory.make().shot();
        // 使用斯伯丁籃球投籃
        BasketBallFactory spaldingBasketBallFactory = new SpaldingBasketBallFactory();
        spaldingBasketBallFactory.make().shot();
    }
}

五、源碼分析

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

在這里插入圖片描述

其中AbstractApplicationContext就是ApplicationContext接口的實現(xiàn)抽象類。

在這里插入圖片描述

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

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

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

優(yōu)點

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

缺點

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

七、適用場景

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

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

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

八、總結(jié)

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

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

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

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

相關(guān)文章

  • Springboot中的自定義攔截器及原理詳解

    Springboot中的自定義攔截器及原理詳解

    這篇文章主要介紹了Springboot中的自定義攔截器及原理詳解,攔截器主要是用于在用戶請求控制中,對于請求識別,鑒權(quán),以及區(qū)分資源是否可以被目標(biāo)方法調(diào)用的安全機制,需要的朋友可以參考下
    2023-12-12
  • Java實現(xiàn)自動生成縮略圖片

    Java實現(xiàn)自動生成縮略圖片

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)自動生成縮略圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • springboot訪問不存在的URL時的處理方法

    springboot訪問不存在的URL時的處理方法

    在前后端分離的模式下,當(dāng)Spring Boot應(yīng)用接收到一個不存在的URL請求時,通常希望返回一個固定的JSON字符串作為響應(yīng),以便前端能夠據(jù)此進(jìn)行相應(yīng)的處理,本文給大家介紹了springboot訪問不存在的URL時的處理方法,需要的朋友可以參考下
    2024-12-12
  • 解決Spring Boot 多模塊注入訪問不到j(luò)ar包中的Bean問題

    解決Spring Boot 多模塊注入訪問不到j(luò)ar包中的Bean問題

    這篇文章主要介紹了解決Spring Boot 多模塊注入訪問不到j(luò)ar包中的Bean問題。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java使用FTPClient類讀寫FTP

    Java使用FTPClient類讀寫FTP

    這篇文章主要為大家詳細(xì)介紹了Java使用FTPClient類讀寫FTP的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 詳解Mybatis中常用的約束文件

    詳解Mybatis中常用的約束文件

    這篇文章主要介紹了詳解Mybatis中常用的約束文件,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • java類和對象原理與用法分析

    java類和對象原理與用法分析

    這篇文章主要介紹了java類和對象原理與用法,結(jié)合實例形式分析了java類和對象的相關(guān)概念、功能、原理、使用技巧與操作注意事項,需要的朋友可以參考下
    2020-02-02
  • 使用hutool進(jìn)行ftp文件下載和上傳詳細(xì)代碼示例

    使用hutool進(jìn)行ftp文件下載和上傳詳細(xì)代碼示例

    在開發(fā)Java項目時,FTP客戶端是經(jīng)常需要使用的工具,因為FTP協(xié)議在文件傳輸方面有著廣泛的應(yīng)用,這篇文章主要給大家介紹了關(guān)于使用hutool進(jìn)行ftp文件下載和上傳的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • Java錯誤問題:找不到或無法加載主類的解決

    Java錯誤問題:找不到或無法加載主類的解決

    這篇文章主要介紹了Java錯誤問題:找不到或無法加載主類的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java算法之?dāng)?shù)組冒泡排序代碼實例講解

    Java算法之?dāng)?shù)組冒泡排序代碼實例講解

    這篇文章主要介紹了Java算法之?dāng)?shù)組冒泡排序代碼實例講解,文中用代碼舉例講解的很清晰,有感興趣的同學(xué)可以研究下
    2021-03-03

最新評論