Java二十三種設計模式-抽象工廠模式(3/23)

抽象工廠模式:復雜系統的靈活構建者

引言

在軟件開發中,抽象工廠模式是一種提供接口以創建相關或依賴對象族的創建型設計模式。這種模式允許客戶端使用一個共同的接口來創建不同的產品族,而無需指定具體類。

基礎知識,java設計模式總體來說設計模式分為三大類:

(1)創建型模式,共5種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

(2)結構型模式,共7種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

(3)行為型模式,共11種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

第一部分:抽象工廠模式概述

1.1 定義與目的

抽象工廠模式的基本定義

抽象工廠模式是一種創建型設計模式,用于創建一系列相關或相互依賴的對象,而不需要指定它們具體的類。這種模式提供了一個接口,用于生成一組相關的對象,而客戶端不需要知道這些對象的具體類。

解釋為何需要抽象工廠模式

在復雜的系統中,對象的創建可能會涉及到多個相關的類,這些類之間可能存在一定的依賴關系。如果直接在客戶端代碼中創建這些對象,會導致客戶端與具體類緊密耦合,難以擴展和維護。抽象工廠模式通過提供一個抽象的創建接口,將對象的創建過程封裝起來,使得系統更加靈活和易于擴展。

1.2 組成元素

抽象工廠(Abstract Factory)

  • 定義了創建一系列相關或依賴對象的接口。
  • 它是一個抽象角色,不實現具體的創建邏輯。

具體工廠(Concrete Factory)

  • 實現了抽象工廠的接口,生成具體的產品對象。
  • 每個具體工廠都對應一個產品族。

抽象產品(Abstract Product)

  • 定義了產品的接口,是所有具體產品類的共同父類。
  • 它是一個抽象角色,不實現具體的產品類。

具體產品(Concrete Product)

  • 實現了抽象產品的接口,是抽象工廠模式中被創建的具體對象。
  • 每個具體產品都屬于一個產品族。

客戶端(Client)

  • 使用抽象工廠來請求創建對象,與具體工廠和具體產品解耦。
  • 客戶端通過抽象工廠的接口與具體工廠交互,從而獲得所需的產品。

角色之間的關系

  • 抽象工廠與具體工廠:具體工廠實現了抽象工廠的接口,負責創建具體的產品。
  • 抽象產品與具體產品:具體產品實現了抽象產品的接口,是系統中實際使用的對象。
  • 客戶端與抽象工廠:客戶端通過抽象工廠的接口請求產品,而不直接與具體工廠或具體產品交互。

抽象工廠模式的核心優勢在于其封裝性、靈活性和可擴展性。通過使用抽象工廠模式,可以在不修改現有代碼的基礎上,引入新的產品族,滿足開閉原則。在下一部分中,我們將通過Java代碼示例來展示抽象工廠模式的具體實現。

?

第二部分:抽象工廠模式實現

2.1 Java實現示例

以下是使用Java語言實現抽象工廠模式的一個示例。假設我們有一個形狀和顏色的工廠,它們可以生成多種類型的形狀和顏色。

// 抽象產品:形狀
interface Shape {void draw();
}// 具體產品:圓形
class Circle implements Shape {public void draw() {System.out.println("Drawing a Circle");}
}// 抽象產品:顏色
interface Color {void fill();
}// 具體產品:紅色
class Red implements Color {public void fill() {System.out.println("Filling with Red Color");}
}// 抽象工廠
interface Factory {Shape getShape();Color getColor();
}// 具體工廠:形狀和顏色工廠
class ShapeColorFactory implements Factory {private String colorType;public ShapeColorFactory(String colorType) {this.colorType = colorType;}@Overridepublic Shape getShape() {return new Circle(); // 假設這個工廠只能生成圓形}@Overridepublic Color getColor() {if ("Red".equalsIgnoreCase(colorType)) {return new Red();}return new Color() { // 默認顏色public void fill() {System.out.println("Filling with Default Color");}};}
}// 客戶端代碼
public class Client {public static void main(String[] args) {Factory factory = new ShapeColorFactory("Red");Shape shape = factory.getShape();shape.draw();Color color = factory.getColor();color.fill();}
}

2.2 設計原則與模式應用

抽象工廠模式如何體現設計原則

開閉原則

抽象工廠模式遵循開閉原則,即軟件實體應對擴展開放,對修改封閉。當需要添加新的形狀或顏色時,我們只需添加相應的具體產品類和具體工廠類,而無需修改現有的抽象工廠和客戶端代碼。

里氏替換原則

在抽象工廠模式中,具體工廠實現了抽象工廠的接口,確保了具體產品能夠替換其抽象產品。這意味著客戶端可以接收任何從抽象工廠派生的實例,并期待它仍然有效。

依賴倒置原則

抽象工廠模式通過依賴于抽象(接口或抽象類)而不是具體實現,從而減少了客戶端與具體類的耦合。客戶端與抽象工廠交互,而不是與具體工廠或具體產品直接交互。

接口隔離原則

雖然抽象工廠模式提供了一個創建相關對象的接口,但在設計時應謹慎考慮接口的職責,避免將不相關的創建方法放在同一個接口中,以符合接口隔離原則。

抽象工廠模式在設計時需要仔細考慮產品族的劃分和工廠接口的設計,以確保系統的靈活性和可擴展性。在下一部分中,我們將探討抽象工廠模式的使用場景。

第三部分:抽象工廠模式使用場景

3.1 產品族的多樣化

何時產品族具有多樣化特征

產品族指的是一組具有共同主題或共享通用接口的產品。當這些產品需要根據不同的場景或條件以不同的方式進行組合時,產品族就呈現出多樣化特征。

  • 例子:考慮一個圖形界面庫,它可能包含多種形狀(如圓形、矩形、三角形)和多種顏色(如紅色、藍色、綠色)。不同的應用程序可能需要不同的形狀和顏色組合,例如,一個兒童繪畫程序可能需要鮮艷的顏色和簡單的形狀。

適合使用抽象工廠模式的情況

  • 當存在多個產品族,并且每個產品族中的產品需要一起使用時。
  • 當需要提供產品族的不同變體,以適應不同的環境或條件時。

抽象工廠模式的應用

  • 通過定義一個抽象工廠接口,不同的具體工廠可以實現這個接口,以創建特定產品族中的對象。
  • 客戶端代碼通過抽象工廠接口與具體工廠交互,請求所需的產品族,而無需關心具體的產品實現。

3.2 系統之間的依賴關系

系統間依賴關系的問題

在大型軟件系統中,不同的組件或模塊之間可能存在依賴關系。如果這些依賴關系處理不當,可能會導致代碼難以維護和擴展。

抽象工廠模式如何進行有效管理

  • 解耦:抽象工廠模式通過將對象創建的邏輯集中到具體的工廠類中,降低了模塊間的直接依賴。
  • 配置化:系統可以通過配置或參數化的方式,動態選擇使用哪個具體工廠,從而適應不同的運行時條件。

應用實例

  • 主題定制:在一個支持主題定制的應用程序中,可以為不同的主題定義不同的工廠,每個工廠負責創建符合該主題的視覺元素。
  • 數據庫連接:在需要連接多種數據庫系統的應用程序中,可以為每種數據庫類型定義一個具體的工廠,而客戶端則通過抽象工廠接口請求數據庫連接。

通過抽象工廠模式,可以在不同的系統或組件之間建立一個清晰且靈活的接口,使得它們能夠更容易地協同工作,同時保持各自的獨立性和可擴展性。在下一部分中,我們將討論抽象工廠模式的優點與缺點。

第三部分:抽象工廠模式使用場景

3.1 產品族的多樣化

在軟件開發中,產品族指的是一組具有共同接口但實現不同的類。當這些類需要根據不同的情境或配置以不同的方式進行組合時,就表現為產品族的多樣化。

何時產品族具有多樣化特征:

  • 當存在多個產品系列,每個系列都有多種產品變體時。
  • 當產品之間存在依賴關系,需要一起使用以保證一致性時。

適合使用抽象工廠模式的情況:

  • 當需要創建的產品族具有多種變體,且這些變體在結構上相關聯時。
  • 當系統需要支持多種主題或外觀,例如不同的GUI主題。

3.2 系統之間的依賴關系

系統間的依賴關系管理是軟件設計中的一個關鍵問題。抽象工廠模式通過將創建邏輯封裝在工廠類中,有助于降低系統間的耦合度。

系統間依賴關系的問題:

  • 當一個系統組件直接依賴于另一個組件的具體實現時,會導致組件之間的耦合度過高。

抽象工廠模式如何進行有效管理:

  • 通過定義一個抽象工廠接口,不同的系統可以提供各自的具體工廠實現,從而生產出符合各自需求的產品。
  • 客戶端代碼通過抽象工廠接口與具體工廠解耦,可以靈活地替換具體的工廠實現,以適應不同的業務需求。

第四部分:抽象工廠模式的優點與缺點

4.1 優點

靈活性和可擴展性:

  • 抽象工廠模式允許系統在不修改現有代碼的基礎上引入新的產品族,提高了系統的可擴展性。

解耦:

  • 客戶端代碼與具體工廠實現解耦,降低了模塊間的依賴。

一致性:

  • 確保了產品族中的對象是一起創建的,從而保證了對象之間的一致性。

4.2 缺點

系統復雜度增加:

  • 每增加一個新的產品族,都需要增加一個新的具體工廠類和產品類,可能會導致系統中類的數量急劇增加。

難以維護:

  • 隨著產品族的增加,抽象工廠模式可能會導致系統結構變得更加復雜,難以理解和維護。

不夠靈活:

  • 如果系統需要支持多種產品族的任意組合,抽象工廠模式可能不如其他模式(如建造者模式)靈活。

在實際應用中,選擇抽象工廠模式需要權衡其優點和缺點。如果系統中存在多個產品族,并且這些產品族需要一起使用,抽象工廠模式是一個不錯的選擇。然而,如果系統需要高度的靈活性和擴展性,可能需要考慮其他設計模式。在下一部分中,我們將比較抽象工廠模式與其他設計模式,并提供一些最佳實踐和建議。

第五部分:抽象工廠模式與其他模式的比較

5.1 與工廠方法模式的比較

工廠方法模式

  • 定義:定義一個用于創建對象的接口,讓子類決定實例化哪一個類。
  • 使用場景:當需要創建的對象類型相對較少,且這些對象的創建邏輯可以封裝在一個共同的工廠類中。

抽象工廠模式

  • 定義:提供一個創建一系列相關或相互依賴對象的接口,而不需要具體指定它們的類。
  • 使用場景:當存在多個產品族,且這些產品族需要一起使用時。

不同點

  • 產品種類:工廠方法模式通常用于創建單一對象,而抽象工廠模式用于創建相關對象的族。
  • 擴展性:抽象工廠模式在添加新的產品族時更加靈活,而工廠方法模式更適合對象創建邏輯相對固定的情況。

5.2 與建造者模式的對比

建造者模式

  • 定義:用于創建一個復雜的對象,同時允許用戶只通過指定復雜對象的類型和內容就能構建它們。
  • 使用場景:當對象的創建過程涉及多個步驟,或者對象的創建邏輯較為復雜時。

抽象工廠模式

  • 定義:用于創建一系列相關或相互依賴的對象。
  • 使用場景:當需要同時創建多個相關對象,并且這些對象的創建邏輯可以封裝在一個共同的工廠類中。

不同點

  • 復雜性:建造者模式適用于構建過程復雜或步驟繁多的對象,而抽象工廠模式適用于創建對象族。
  • 靈活性:建造者模式在構建過程中提供了更多的控制和靈活性,而抽象工廠模式則強調了對象族的一致性。

第六部分:最佳實踐和建議

6.1 使用抽象工廠模式的最佳時機

  • 產品族多樣化:當系統中存在多個產品族,且這些產品族需要根據不同的配置或條件進行變化時。
  • 系統解耦:當需要降低系統組件之間的耦合度,提高模塊的獨立性和可替換性時。

6.2 避免濫用抽象工廠模式

  • 過度擴展:避免在產品族非常簡單或不相關的情況下使用抽象工廠模式,這可能會導致不必要的系統復雜性。
  • 難以維護:隨著產品族的增加,管理大量的工廠類和產品類可能會變得困難。

6.3 替代方案

原型模式

  • 定義:通過復制現有的對象來創建新的實例。
  • 適用場景:當創建新對象的成本較高,或者需要快速復制現有對象時。

依賴注入

  • 定義:通過外部提供依賴對象,而不是在類內部創建。
  • 好處:提高了代碼的可測試性和靈活性。

服務定位器模式

  • 定義:用于查找和訪問服務的機制。
  • 適用場景:當系統中有大量的服務需要被訪問,并且服務實例的創建和管理較為復雜時。

抽象工廠模式是一種強大的設計模式,適用于創建相關或依賴對象族的場景。然而,合理選擇使用時機和避免濫用同樣重要。了解替代方案可以幫助開發者根據具體需求選擇最合適的設計模式。

結語

抽象工廠模式是處理復雜系統中對象創建問題的有效工具。通過本文的深入分析,希望讀者能夠對抽象工廠模式有更全面的理解,并在實際開發中做出合理的設計選擇。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46248.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46248.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46248.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot日常:常用數據類型比較

文章目錄 前言基本類型引用類型date類型比較LocalDate類型比較LocalDateTime類型比較Bigdecimal類型比較對象類型比較 前言 在Java中,我們一般分為基本類型的比較和引用類型的比較,下面按照這兩個大分類梳理一下日常用到的類型比較 基本類型 基本數據類型比較主要…

算法 —— LRU算法

算法 —— LRU算法 LRULRU算法的工作原理:實現方法:性能考慮: 模擬過程splice函數對于std::list和std::forward_list基本語法:功能描述: 示例:注意事項: 如果大家已經學習過了Cache的替換算法和…

ElementUIV12相關使用方法

今日內容 零、 復習昨日 零、 復習昨日 一、Element UI Element,一套為開發者、設計師和產品經理準備的基于 Vue 2.0 的桌面端組件庫 官網: https://element.eleme.cn/#/zh-CN Element Plus,基于 Vue 3,面向設計師和開發者的組件庫 官網: htt…

C語言--遞歸

曾經有一個段子:上大學時,我們的c語言老師說:學c時,如果有50%的同學死在了循環上面,那么就有90%的同學死在了遞歸上面。接下來,就來看看遞歸是怎么個事? 一.遞歸的介紹 遞歸是指一個函數直接或…

Spring中的@Transactional什么時候會失效?

在Spring中,Transactional注解用于聲明式事務管理,它可以使方法在事務上下文中執行。然而,Transactional注解有時會失效,這通常是由于以下幾種情況: 1. 非public方法: - Transactional注解默認只能應用…

跨平臺WPF音樂商店應用程序

目錄 一 簡介 二 設計思路 三 源碼 一 簡介 支持在線檢索音樂,支持實時瀏覽當前收藏的音樂及音樂數據的持久化。 二 設計思路 采用MVVM架構,前后端分離,子界面彈出始終位于主界面的中心。 三 源碼 視窗引導啟動源碼: namesp…

MySQL(8)事務

目錄 1.事務; 1.事務: 1.1 如果CURD不加限制會這么樣子? 可能造成數據同時被修改, 數據修改的結果是未知的.(可以想一下之前的搶票線程問題) 1.2 事務概念: 事務就是一組DML語句組成,這些語句在邏輯上存在相關性,這一組DML語句要么全部成功&#xff0…

基于python旅游景點滿意度分析設計與實現

1.1研究背景與意義 1.1.1研究背景 隨著旅游業的快速發展,滿意度分析成為評估旅游景點質量和提升游客體驗的重要手段。海口市作為中國的旅游城市之一,其旅游景點吸引了大量游客。然而,如何科學評估和提升海口市旅游景點的滿意度,…

中電金信-杭州工商銀行|面試真題|2024年

中電金信-杭州工商銀行 JAva集合用過哪些? ArrayList、LinkedList、HashSet、TreeSet、HashMap、LinkedHashMap、ConcurrentHashMap Arraylist和linkbist區別 ArrayList底層是數據,查詢快,增刪慢,線程不安全,效率高LikedList 底…

【概率論三】參數估計:點估計(矩估計、極大似然法)、區間估計

文章目錄 一. 點估計1. 矩估計法2. 極大似然法2.1. 似然函數2.2. 極大似然估計法 3. 評價估計量的標準3.1. 無偏性3.2. 有效性3.3. 一致性 二. 區間估計1. 區間估計的概念2. 正態總體參數的區間估計 參數估計講什么 由樣本來確定未知參數參數估計分為點估計與區間估計 一. 點估…

算法:二叉樹相關

目錄 題目一:單值二叉樹 題目二:二叉樹的最大深度 題目三:相同的樹 題目四:對稱二叉樹 題目五:另一棵樹的子樹 題目六:二叉樹的前序遍歷 題目七:二叉樹遍歷 題目八:根據二叉…

linux搭建mysql主從復制(一主一從)

目錄 0、環境部署 1、主服務器配置 1.1 修改mysql配置文件 1.2 重啟mysql 1.3 為從服務器授權 1.4 查看二進制日志坐標 2、從服務器配置 2.1 修改mysql配置文件 2.2 重啟mysql 2.3 配置主從同步 2.4 開啟主從復制 3、驗證主從復制 3.1 主服務器上創建test…

微服務拆分流程 (黑馬商城拆分商品服務)

1. 創建新module - maven模塊,并引入依賴(可以復制 把不需要的依賴刪掉 ) 2. 新建包com.hmall.xx(業務名),添加和修改啟動類,新建mapper包、domain包 - service包 - controller包 3. 拷貝并修…

4款良心軟件,免費又實用,內存滿了都舍不得卸載

以下幾款高質量軟件,若是不曾體驗,實在是遺憾可惜。 PDF Guru 這是一款開源免費的PDF編輯軟件,打開之后功能一目了然。 可以拆分、合并PDF,也可以給PDF添加水印和密碼,同時也可以去除別人PDF里的水印或密碼&#xff0…

HouseCrafter:平面草稿至3D室內場景的革新之旅

在室內設計、房地產展示和影視布景設計等領域,將平面草稿圖快速轉換為立體的3D場景一直是一個迫切的需求。HouseCrafter,一個創新的AI室內設計方案,正致力于解決這一挑戰。本文將探索HouseCrafter如何將這一過程自動化并提升至新的高度。 一、定位:AI室內設計的革新者 Ho…

Scala之OOP講解

Scala OOP 前序 Scala 為純粹OOP1、不支持基本類型:一切皆為對象 Byte,Int,...2、不支持靜態關鍵字:static 3、支持類型推斷【通過判斷泛型的父子關系來確定泛型類的父子關系>協變,逆變,不變】和類型預定, 動靜…

【iOS】類對象的結構分析

目錄 對象的分類object_getClass和class方法isa流程和繼承鏈分析isa流程實例驗證類的繼承鏈實例驗證 類的結構cache_t結構bits分析實例驗證屬性properties方法methods協議protocolsro類方法 類結構流程圖解 對象的分類 OC中的對象主要可以分為3種:實例對象&#xf…

【React】JSX基礎

一、簡介 JSX是JavaScript XML的縮寫,它是一種在JavaScript代碼中編寫類似HTML模板的結構的方法。JSX是React框架中構建用戶界面(UI)的核心方式之一。 1.什么是JSX JSX允許開發者使用類似HTML的聲明式模板來構建組件。它結合了HTML的直觀性…

TDesign組件庫日常應用的一些注意事項

【前言】Element(餓了么開源組件庫)在國內使用的普及率和覆蓋率高于TDesign-vue(騰訊開源組件庫),這也導致日常開發遇到組件使用上的疑惑時,網上幾乎搜索不到其文章解決方案,只能深挖官方文檔或…

2024.7.17 ABAP面試題目總結

2024.7.17 用的SAP什么平臺,S4/HANA嗎,有用過ECC嗎 S4/HANA,沒用過ECC 會不會CDS VIEW 不會 會不會FIORI 不會 銀企直連里面的邏輯了解不 不了解,做過,但是只能算很簡單的修改 SAP做增強,如何創建…