Java設(shè)計模式之抽象工廠模式詳解
1. 抽象工廠模式
1.1 抽象工廠模式的定義
- 針對工廠方法模式無法創(chuàng)建一組相關(guān)或相互依賴對象的問題,引入了抽象工廠模式
- 抽象工廠模式的官方定義如下:
一種為訪問類提供一個創(chuàng)建一組相關(guān)或相互依賴對象的接口,且訪問類無須指定所要產(chǎn)品的具體類就能得到同族的、不同等級的產(chǎn)品的模式結(jié)構(gòu)。
1.2 定義解讀
提供一個創(chuàng)建一組相關(guān)或相互依賴對象的接口
- 相對工廠方法模式,抽象工廠模式的抽象工廠定義了多個創(chuàng)建對象的接口
不同等級的產(chǎn)品
- 不同類的產(chǎn)品,又叫不同等級的產(chǎn)品。
- 工廠方法模式中,只考慮同一等級產(chǎn)品的生產(chǎn),只是同一等級的產(chǎn)品有很多不同的型號,從而需要創(chuàng)建多個具體工廠
- 就像電子廠只生產(chǎn)游戲機,游戲機有多種類型:插卡的游戲機、插光盤的游戲機、便攜式游戲機(玩俄羅斯方塊的那種)
- 這時,就發(fā)現(xiàn)工廠方法確實抽象不足:都是同一類產(chǎn)品,只是型號有差異,干嘛創(chuàng)建那么多具體工廠
同族的產(chǎn)品
- 現(xiàn)實生活中,電子廠不止生產(chǎn)游戲機,還生產(chǎn)電視機、音箱等產(chǎn)品。
- 這些由一個工廠生產(chǎn)的不同等級的產(chǎn)品,被稱為產(chǎn)品族
- 因此,同族的不同等級的產(chǎn)品,就是指一個工廠能生產(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)用者無需指定對象類型,就可以通過同一個工廠類創(chuàng)建多種類型的對象
2. UML圖
抽象工廠模式的UML圖如下:
- 抽象工廠(Abstract Factory):定義了多個創(chuàng)建產(chǎn)品的接口,可以創(chuàng)建多個不同等級的產(chǎn)品
- 具體工廠(Abstract Factory):實現(xiàn)抽象工廠中的抽象方法,負責創(chuàng)建具體的產(chǎn)品
- 抽象產(chǎn)品(Product): 相對工廠方法模式,抽象工廠模式中的產(chǎn)品將是多種等級的。因此,一般會定義多個抽象產(chǎn)品

3. 代碼示例
- 以海爾和TCL兩家公司為例,實現(xiàn)抽象工廠模式
創(chuàng)建兩個抽象產(chǎn)品類
- 假設(shè),產(chǎn)品只有電視機和空調(diào)兩種等級
public interface TV {
void play();
}
public interface AirConditioner {
void heat();
}創(chuàng)建具體產(chǎn)品類
- 實現(xiàn)抽象產(chǎn)品接口,為海爾和TCL公司創(chuàng)建具體產(chǎn)品類
public class HaierTV implements TV{
@Override
public void play() {
System.out.println("海爾電視機,銷量全國領(lǐng)先");
}
}
public class TCLTV implements TV{
@Override
public void play() {
System.out.println("TCL牌電視機,家家都在看的電視機");
}
}
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)建抽象工廠類
- 有兩個接口,分別用于創(chuàng)建電視機和空調(diào)
public interface AbstractFactory {
TV getTV();
AirConditioner getAirConditioner();
}創(chuàng)建具體工廠類
- 創(chuàng)建具體工廠類,分別對應(yīng)海爾和TCL兩家公司,實現(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é)
適用場景
- 需要創(chuàng)建的對象是一系列相關(guān)或相互依賴的產(chǎn)品族
- 不同環(huán)境,需要使用不同產(chǎn)品族(系統(tǒng)中有多個產(chǎn)品族,但每次只使用其中的某一族產(chǎn)品)
- 例如,Java 的 AWT 中的 Button 和 Text 等構(gòu)件,在 Windows 和 UNIX 中的本地實現(xiàn)是不同的
- 這時,可以使用抽象工廠,創(chuàng)建屬于不同操作系統(tǒng)的視窗構(gòu)件。
開閉原則的傾斜性
- 增加一個產(chǎn)品族,只需要增加一個新的工廠類,無需修改已有的工廠 —— 滿足開閉原則
- 增加一個新等級的產(chǎn)品,抽象工廠和具體工廠都需要進行修改 —— 不滿足開閉原則
- 這樣的現(xiàn)象,被稱作開閉原則的傾斜性
4.2 工廠模式的總結(jié)
簡單工廠模式
- 從長期的編程習(xí)慣總結(jié)出來的簡單工廠模式,需要調(diào)用者傳入對象名稱,才能為其創(chuàng)建指定的對象
- 新增對象類型時,需要修改已有代碼,違背了開閉原則
工廠方法模式
- 每個工廠只負責創(chuàng)建一種類型的對象,是對簡單工廠模式的升級改造
- 雖然遵守了開閉原則,但是容易工廠類過多,且不支持創(chuàng)建一組相關(guān)或相互依賴的對象的場景
抽象工廠模式
- 將一組相關(guān)或相互依賴的對象,抽象成產(chǎn)品族,每個工廠負責創(chuàng)建一個產(chǎn)品族
- 開閉原則的傾斜性:新增產(chǎn)品族,滿足開閉原則;新增產(chǎn)品,不滿足開閉原則
到此這篇關(guān)于Java設(shè)計模式之抽象工廠模式詳解的文章就介紹到這了,更多相關(guān)Java抽象工廠模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 中的 DataInputStream 介紹_動力節(jié)點Java學(xué)院整理
DataInputStream 是數(shù)據(jù)輸入流。它繼承于FilterInputStream。接下來通過本文給大家介紹Java 中的 DataInputStream的相關(guān)知識,需要的朋友參考下吧2017-05-05
解決IDEA啟動springboot項目報錯java.lang.ClassNotFoundException:?jav
這篇文章主要介紹了解決IDEA啟動springboot項目報錯java.lang.ClassNotFoundException:?javax.servlet.ServletContext問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Java中@Constraint實現(xiàn)自定義校驗注解
本文主要介紹了Java中@Constraint實現(xiàn)自定義校驗注解,需配合ConstraintValidator實現(xiàn)校驗邏輯,適用于HibernateValidator等框架,感興趣的可以了解一下2025-05-05
Java高效實現(xiàn)PDF與OFD的相互轉(zhuǎn)換的示例代碼
在數(shù)字化辦公日益普及的今天,文檔格式的標準化與跨平臺兼容性成為企業(yè)和開發(fā)者面臨的重要挑戰(zhàn),OFD作為國家標準,在政務(wù)、金融等領(lǐng)域具有不可替代的地位,而PDF則以其廣泛的兼容性成為日常交流的首選本文將深入探討如何高效地實現(xiàn)PDF與OFD的相互轉(zhuǎn)換2025-10-10
Java Optional<Foo>轉(zhuǎn)換成List<Bar>的實例方法
在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于Java Optional<Foo>轉(zhuǎn)換成List<Bar>的實例方法,有需要的朋友們可以跟著學(xué)習(xí)下。2021-06-06
SpringBoot整合Redis實現(xiàn)登錄失敗鎖定功能(實例詳解)
本文我們已經(jīng)探討如何利用Redis來實現(xiàn)鎖定賬戶的安全措施,以及通過SpringBoot整合Redis實現(xiàn)了這一功能,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧2024-02-02

