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

Java設(shè)計(jì)模式之抽象工廠模式詳解

 更新時(shí)間:2023年09月21日 09:39:53   作者:曉之木初  
這篇文章主要介紹了Java設(shè)計(jì)模式之抽象工廠模式詳解,抽象工廠是一種為訪問類提供一個(gè)創(chuàng)建一組相關(guān)或相互依賴對象的接口,且訪問類無須指定所要產(chǎn)品的具體類就能得到同族的、不同等級的產(chǎn)品的模式結(jié)構(gòu),需要的朋友可以參考下

1. 抽象工廠模式

1.1 抽象工廠模式的定義

  • 針對工廠方法模式無法創(chuàng)建一組相關(guān)或相互依賴對象的問題,引入了抽象工廠模式
  • 抽象工廠模式的官方定義如下:

一種為訪問類提供一個(gè)創(chuàng)建一組相關(guān)或相互依賴對象的接口,且訪問類無須指定所要產(chǎn)品的具體類就能得到同族的、不同等級的產(chǎn)品的模式結(jié)構(gòu)。

1.2 定義解讀

提供一個(gè)創(chuàng)建一組相關(guān)或相互依賴對象的接口

  • 相對工廠方法模式,抽象工廠模式的抽象工廠定義了多個(gè)創(chuàng)建對象的接口

不同等級的產(chǎn)品

  • 不同類的產(chǎn)品,又叫不同等級的產(chǎn)品。
  • 工廠方法模式中,只考慮同一等級產(chǎn)品的生產(chǎn),只是同一等級的產(chǎn)品有很多不同的型號,從而需要?jiǎng)?chuàng)建多個(gè)具體工廠
  • 就像電子廠只生產(chǎn)游戲機(jī),游戲機(jī)有多種類型:插卡的游戲機(jī)、插光盤的游戲機(jī)、便攜式游戲機(jī)(玩俄羅斯方塊的那種)
  • 這時(shí),就發(fā)現(xiàn)工廠方法確實(shí)抽象不足:都是同一類產(chǎn)品,只是型號有差異,干嘛創(chuàng)建那么多具體工廠

同族的產(chǎn)品

  • 現(xiàn)實(shí)生活中,電子廠不止生產(chǎn)游戲機(jī),還生產(chǎn)電視機(jī)、音箱等產(chǎn)品。
  • 這些由一個(gè)工廠生產(chǎn)的不同等級的產(chǎn)品,被稱為產(chǎn)品族
  • 因此,同族的不同等級的產(chǎn)品,就是指一個(gè)工廠能生產(chǎn)多類產(chǎn)品,與前面的創(chuàng)建一組相關(guān)或相互依賴對象的接口呼應(yīng)
  • 以海爾和TCL兩家公司為例,產(chǎn)品族和產(chǎn)品等級的示意圖如下

在這里插入圖片描述

總結(jié)起來

  • 抽象工廠模式中,工廠不再只生產(chǎn)一類產(chǎn)品,而是可以生產(chǎn)多類產(chǎn)品
  • 也就是說,工廠可以支持多種類型的對象的創(chuàng)建
  • 調(diào)用者無需指定對象類型,就可以通過同一個(gè)工廠類創(chuàng)建多種類型的對象

2. UML圖

抽象工廠模式的UML圖如下:

  • 抽象工廠(Abstract Factory):定義了多個(gè)創(chuàng)建產(chǎn)品的接口,可以創(chuàng)建多個(gè)不同等級的產(chǎn)品
  • 具體工廠(Abstract Factory):實(shí)現(xiàn)抽象工廠中的抽象方法,負(fù)責(zé)創(chuàng)建具體的產(chǎn)品
  • 抽象產(chǎn)品(Product): 相對工廠方法模式,抽象工廠模式中的產(chǎn)品將是多種等級的。因此,一般會定義多個(gè)抽象產(chǎn)品

在這里插入圖片描述

3. 代碼示例

  • 以海爾和TCL兩家公司為例,實(shí)現(xiàn)抽象工廠模式

創(chuàng)建兩個(gè)抽象產(chǎn)品類

  • 假設(shè),產(chǎn)品只有電視機(jī)和空調(diào)兩種等級
public interface TV {
    void play();
}
public interface AirConditioner {
    void heat();
}

創(chuàng)建具體產(chǎn)品類

  • 實(shí)現(xiàn)抽象產(chǎn)品接口,為海爾和TCL公司創(chuàng)建具體產(chǎn)品類
public class HaierTV implements TV{
    @Override
    public void play() {
        System.out.println("海爾電視機(jī),銷量全國領(lǐng)先");
    }
}
public class TCLTV implements TV{
    @Override
    public void play() {
        System.out.println("TCL牌電視機(jī),家家都在看的電視機(jī)");
    }
}
public class HaierAirConditioner implements AirConditioner{
    @Override
    public void heat() {
        System.out.println("海爾牌空調(diào),制熱效果好,省電又省心~");
    }
}
public class TCLAirConditioner implements AirConditioner {
    @Override
    public void heat() {
        System.out.println("TCL牌空調(diào),制熱效果杠杠的");
    }
}

創(chuàng)建抽象工廠類

  • 有兩個(gè)接口,分別用于創(chuàng)建電視機(jī)和空調(diào)
public interface AbstractFactory {
    TV getTV();
    AirConditioner getAirConditioner();
}

創(chuàng)建具體工廠類

  • 創(chuàng)建具體工廠類,分別對應(yīng)海爾和TCL兩家公司,實(shí)現(xiàn)具體產(chǎn)品的創(chuàng)建
public class HaierFactory implements AbstractFactory{
    @Override
    public TV getTV() {
        return new HaierTV();
    }
    @Override
    public AirConditioner getAirConditioner() {
        return new HaierAirConditioner();
    }
}
public class TCLFactory implements AbstractFactory{
    @Override
    public TV getTV() {
        return new TCLTV();
    }
    @Override
    public AirConditioner getAirConditioner() {
        return new TCLAirConditioner();
    }
}

4. 總結(jié)

4.1 抽象工廠模式的總結(jié)

適用場景

  • 需要?jiǎng)?chuàng)建的對象是一系列相關(guān)或相互依賴的產(chǎn)品族
  • 不同環(huán)境,需要使用不同產(chǎn)品族(系統(tǒng)中有多個(gè)產(chǎn)品族,但每次只使用其中的某一族產(chǎn)品)
    • 例如,Java 的 AWT 中的 Button 和 Text 等構(gòu)件,在 Windows 和 UNIX 中的本地實(shí)現(xiàn)是不同的
    • 這時(shí),可以使用抽象工廠,創(chuàng)建屬于不同操作系統(tǒng)的視窗構(gòu)件。

開閉原則的傾斜性

  • 增加一個(gè)產(chǎn)品族,只需要增加一個(gè)新的工廠類,無需修改已有的工廠 —— 滿足開閉原則
  • 增加一個(gè)新等級的產(chǎn)品,抽象工廠和具體工廠都需要進(jìn)行修改 —— 不滿足開閉原則
  • 這樣的現(xiàn)象,被稱作開閉原則的傾斜性

4.2 工廠模式的總結(jié)

簡單工廠模式

  • 從長期的編程習(xí)慣總結(jié)出來的簡單工廠模式,需要調(diào)用者傳入對象名稱,才能為其創(chuàng)建指定的對象
  • 新增對象類型時(shí),需要修改已有代碼,違背了開閉原則

工廠方法模式

  • 每個(gè)工廠只負(fù)責(zé)創(chuàng)建一種類型的對象,是對簡單工廠模式的升級改造
  • 雖然遵守了開閉原則,但是容易工廠類過多,且不支持創(chuàng)建一組相關(guān)或相互依賴的對象的場景

抽象工廠模式

  • 將一組相關(guān)或相互依賴的對象,抽象成產(chǎn)品族,每個(gè)工廠負(fù)責(zé)創(chuàng)建一個(gè)產(chǎn)品族
  • 開閉原則的傾斜性:新增產(chǎn)品族,滿足開閉原則;新增產(chǎn)品,不滿足開閉原則

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

相關(guān)文章

  • Mybatis中的常用OGNL表達(dá)式

    Mybatis中的常用OGNL表達(dá)式

    這篇文章主要介紹了Mybatis中的常用OGNL表達(dá)式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • logback打印多次mybatis的sql日志問題

    logback打印多次mybatis的sql日志問題

    這篇文章主要介紹了logback打印多次mybatis的sql日志問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java讀取properties文件內(nèi)容的幾種方式詳解

    Java讀取properties文件內(nèi)容的幾種方式詳解

    這篇文章主要介紹了Java讀取properties文件內(nèi)容的幾種方式詳解,讀取properties配置文件在實(shí)際的開發(fā)中使用的很多,本文來介紹常用的幾種實(shí)現(xiàn)方式,需要的朋友可以參考下
    2023-11-11
  • FreeMarker如何調(diào)用Java靜態(tài)方法及靜態(tài)變量方法

    FreeMarker如何調(diào)用Java靜態(tài)方法及靜態(tài)變量方法

    這篇文章主要介紹了FreeMarker如何調(diào)用Java靜態(tài)方法及靜態(tài)變量方法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • JDBC中Statement的Sql注入問題詳解

    JDBC中Statement的Sql注入問題詳解

    這篇文章主要介紹了JDBC中Statement的Sql注入問題詳解,sql注入攻擊指的是通過構(gòu)建特殊的輸入作為參數(shù)傳入web應(yīng)用程序,而這些輸入大都是sql語法里的一些組合,通過執(zhí)行sql語句進(jìn)而執(zhí)行攻擊者所要做的操作,需要的朋友可以參考下
    2023-10-10
  • Redisson分布式信號量RSemaphore的使用超詳細(xì)講解

    Redisson分布式信號量RSemaphore的使用超詳細(xì)講解

    這篇文章主要介紹了Redisson分布式信號量RSemaphore的使用,基于Redis的Redisson的分布式信號量RSemaphore采用了與java.util.concurrent.Semaphore相似的接口和用法
    2023-02-02
  • 探討Java驗(yàn)證碼制作(下篇)

    探討Java驗(yàn)證碼制作(下篇)

    這篇文章主要介紹了探討Java驗(yàn)證碼制作(下篇)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • java+io+swing實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    java+io+swing實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java+io+swing實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • quartz時(shí)間表達(dá)式Cron詳解

    quartz時(shí)間表達(dá)式Cron詳解

    這篇文章介紹了quartz時(shí)間表達(dá)式Cron,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Spring boot GC實(shí)現(xiàn)過程原理解析

    Spring boot GC實(shí)現(xiàn)過程原理解析

    這篇文章主要介紹了Spring boot GC實(shí)現(xiàn)過程原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評論