《設計模式》抽象工廠模式

1.抽象工廠模式定義

抽象工廠模式(Abstact Factory ): 提供一個創建一系列相關或者相互依賴對象的接口,而無須指定它們具體的類。

1.1 UML圖:

在這里插入圖片描述

2.抽象工廠模式舉例:

業務場景:需要實現一個數據訪問程序。

  • 要求支持兩種訪問方式 access 和 sqlserver
  • 支持兩張表 User表和department表

2.1 UML圖:

在這里插入圖片描述

2.2 核心代碼:

IFactory接口

public interface IFactory {public IUser createUser();public IDepartment createDepartment();}

IUser接口

public interface IUser {public void insert(User user);public User getUser(int id);
}

IDepartment接口

public interface IDepartment {public void insert(Department department);public Department getDepartment(int id);
}

AccessFactory

public class AccessFactory implements IFactory {public IUser createUser(){return new AccessUser();}public IDepartment createDepartment(){return new AccessDepartment();}}

SqlserverFactory

public class SqlserverFactory implements IFactory {public IUser createUser(){return new SqlserverUser();}public IDepartment createDepartment(){return new SqlserverDepartment();}}

AccessUser

public class AccessUser implements IUser {//新增一個用戶public void insert(User user){System.out.println("在Access中給User表增加一條記錄");     }//獲取一個用戶信息public User getUser(int id){System.out.println("在Access中根據用戶ID得到User表一條記錄");   return null;  }}

SqlserverUser

public class SqlserverUser implements IUser {//新增一個用戶public void insert(User user){System.out.println("在SQL Server中給User表增加一條記錄");     }//獲取一個用戶信息public User getUser(int id){System.out.println("在SQL Server中根據用戶ID得到User表一條記錄");   return null;  }}

AccessDepartment

public class AccessDepartment implements IDepartment {//新增一個部門public void insert(Department department){System.out.println("在Access中給Department表增加一條記錄");     }//獲取一個部門信息public Department getDepartment(int id){System.out.println("在Access中根據部門ID得到Department表一條記錄");   return null;  }}

SqlserverDepartment

public class SqlserverDepartment implements IDepartment {//新增一個部門public void insert(Department department){System.out.println("在SQL Server中給Department表增加一條記錄");     }//獲取一個部門信息public Department getDepartment(int id){System.out.println("在SQL Server中根據部門ID得到Department表一條記錄");   return null;  }
}

User

public class User {//用戶IDprivate int _id;public int getId(){return this._id;}public void setId(int value){this._id=value;}//用戶姓名private String _name;public String getName(){return this._name;}public void setName(String value){this._name=value;}}

Department

public class Department {//部門IDprivate int _id;public int getId(){return this._id;}public void setId(int value){this._id=value;}//部門名稱private String _name;public String getName(){return this._name;}public void setName(String value){this._name=value;}}

Client

public class Client {public static void main(String[] args){System.out.println("**********************************************");		System.out.println("抽象工廠模式");System.out.println();		User user = new User();Department department = new Department();IFactory factory = new SqlserverFactory();//IFactory factory = new AccessFactory();IUser iu = factory.createUser();iu.insert(user);    //新增一個用戶iu.getUser(1);      //得到用戶ID為1的用戶信息IDepartment idept = factory.createDepartment();idept.insert(department);    //新增一個部門idept.getDepartment(2);      //得到部門ID為2的用戶信息System.out.println();System.out.println("**********************************************");}
}

輸出結果:
在這里插入圖片描述

3. 抽象工廠模式的優缺點;

3.1 優點

  • 靈活性和可擴展性:
    • 抽象工廠模式允許系統在不修改現有代碼的基礎上引入新的產品族,提高了系統的可擴展性。
  • 解耦:
    • 客戶端代碼與具體工廠實現解耦,降低了模塊間的依賴。
  • 一致性:
    • 確保了產品族中的對象是一起創建的,從而保證了對象之間的一致性。

3.2 缺點

  • 系統復雜度增加:
    • 每增加一個新的產品族,都需要增加一個新的具體工廠類和產品類,可能會導致系統中類的數量急劇增加。
  • 難以維護:
    • 隨著產品族的增加,抽象工廠模式可能會導致系統結構變得更加復雜,難以理解和維護。
  • 不夠靈活:
    • 如果系統需要支持多種產品族的任意組合,抽象工廠模式可能不如其他模式(如建造者模式)靈活。

6. 總結

抽象工廠模式(Abstact Factory ): 提供一個創建一系列相關或者相互依賴對象的接口,而無須指定它們具體的類。

7.參考

  • https://cloud.tencent.com/developer/article/2478362
  • https://blog.csdn.net/m0_46248770/article/details/149914634

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

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

相關文章

git stash臨時保存工作區

通過git stash 可以靈活管理臨時修改,保持工作區整潔,是多人協作或多任務切換時的常用工具,主要用于臨時保存工作區和暫存區修改的命令,常用于以下場景:(1)需要切換分支,但不想立即提…

Vue 3.5+ Teleport defer 屬性詳解:解決組件渲染順序問題的終極方案

📋 概述 Vue 3.5 引入了 Teleport 的 defer 屬性,這是一個重要的延遲解析特性。傳統的 Teleport 在組件掛載時會立即解析目標容器,而 defer 屬性允許推遲 Teleport 的目標解析,直到應用的其他部分掛載完成。 ?? 傳統 Teleport …

【102頁PPT】某著名企業智能制造解決方案及智能工廠產品介紹(附下載方式)

篇幅所限,本文只提供部分資料內容,完整資料請看下面鏈接 https://download.csdn.net/download/2501_92808811/91662620 資料解讀:某著名企業智能制造解決方案及智能工廠產品介紹 詳細資料請看本解讀文章的最后內容 智能制造背景與整體規劃…

Revisiting Character-level Adversarial Attacks for Language Models

文章目錄**核心設計目標****關鍵步驟與實現細節**1. **候選位置選擇(Algorithm 1: get_top_locations)**2. **擾動生成與篩選(Algorithm 2: Charmer)**3. **適配大語言模型(LLM)的攻擊****實驗中的性能表現…

(一)Python + 地球信息科學與技術 (GeoICT)=?

目錄 引子 一、核心定位:Python 為何能重塑 GeoICT? 二、Python 在 GeoICT 中的關鍵應用領域 1. 空間數據處理(GIS 基礎) 2. 遙感圖像處理與解譯 3. 空間分析與建模 4. 地學數據可視化 5. 時空大數據分析 三、Python GeoI…

OpenAI 發布了 GPT-5,有哪些新特性值得關注?國內怎么使用GPT5?

GPT-5很強,在LMAreana上獲得了1481分,超過Gemini 2.5 Pro,奪回第一。 國內怎么使用GPT5?-> zhangfeidezhu.com/?p1033 這次發布的GPT-5系列包含三個模型: GPT-5:適合復雜推理、廣泛的世界知識&#x…

PowerPoint和WPS演示放映PPT時如何禁止鼠標翻頁

在演示播放PPT的時候,我們有時候會用鼠標在幻燈片上劃重點,一不小心就點擊了鼠標左鍵,而默認的鼠標左鍵是向下翻頁(下一步)。可以簡單設置一下,禁用鼠標翻頁的功能,改為其他方式翻頁。一、禁用/…

基于springboot養老院管理系統 畢業論文+項目源碼及數據庫文件

!!! 有需要的小伙伴可以通過文章末尾名片咨詢我哦!!! 💕💕作者:優創學社 💕💕個人簡介:本人在讀博士研究生,擁有多年程序開…

Meteodyn WT 6.7(Meteodyn)風力資源評估及微觀選址軟件工具

Meteodyn WT 6.7(Meteodyn)風力資源評估及微觀選址軟件工具,基于計算流體力學(CFD)技術,主要用于復雜地形下的風能評估和風電場選址。該軟件由法國政府環境與能源署(ADEME)支持開發&…

計算機網絡 TCP time_wait 狀態 詳解

TCP 的 TIME_WAIT 狀態是 TCP 連接終止過程中 主動關閉連接的一方(通常是先調用 close() 或主動發送 FIN 的一端)進入的一個重要狀態。理解其原理、副作用和優化策略對高性能網絡編程和服務器調優至關重要。🔍 一、TIME_WAIT 是什么&#xff…

《GuardHFL: Privacy Guardian for Heterogeneous Federated Learning》——論文閱讀

研究背景:異構聯邦中各客戶端模型結構,精度,算力都不同,無法像傳統聯邦那樣共享梯度,只能通過“查詢-響應”使用輔助數據來訓練模型。這種方法存在嚴重隱私問題:直接共享查詢樣本會泄露敏感信息&#xff0c…

Spring AI 進階之路01:三步將 AI 整合進 Spring Boot

引子 當 LLM 的浪潮以不可阻擋之勢席卷全球,從改變用戶交互到重塑商業模式,我們每一位開發者都身處這場技術變革的中心。作為龐大的 Java 生態中的一員,你是否也曾思考:當 Python 似乎成為 AI 的“官方語言”時,我們這…

pycharm2025導入anaconda創建的各個AI環境

目錄1.pycharm下載及安裝2.導入anaconda的環境到pycharm項目中1.pycharm下載及安裝 建議從官網下載,不要亂下載。 https://www.jetbrains.com.cn/en-us/pycharm/ 右上角可以切換中英文,在此切換為中文。 點擊下載,如下頁面: 點擊中間下載w…

獲取IPv6地址的三種方式

DHCPv6無狀態自動分配IP地址Server 配置&#xff1a;<Huawei>system-view[Huawei]ipv6[Huawei]dhcp enable[Huawei]dhcpv6 pool pool1[Huawei-dhcpv6-pool-pool1]dns-server 2002::2[Huawei-dhcpv6-pool-pool1]dns-domain-name example.com[Huawei-dhcpv6-pool-pool1]qui…

[Oracle數據庫] Oracle 復雜查詢

對于剛接觸 Oracle 數據庫的初學者來說&#xff0c;簡單查詢&#xff08;如SELECT * FROM 表名&#xff09;可能不難掌握&#xff0c;但面對復雜業務場景時&#xff0c;就需要更強大的查詢能力。本文將圍繞 Oracle 復雜查詢的核心知識點展開&#xff0c;包括條件邏輯、分組函數…

Redis-plus-plus API使用指南:通用操作與數據類型接口介紹

&#x1f351;個人主頁&#xff1a;Jupiter.&#x1f680; 所屬專欄&#xff1a;Redis 歡迎大家點贊收藏評論&#x1f60a;目錄通用 API連接 Redis1. get/set2. exists 方法3. del 方法4. keys 方法5. expire 方法6. ttl 方法7. type 方法8. flushall 方法String 類型 API1. ge…

基于遺傳編程的自動程序生成

這里寫目錄標題核心概念與工作原理1. 個體表示&#xff1a;樹結構2. 初始化種群3. 適應度評估4. 選擇5. 遺傳操作&#xff08;繁殖&#xff09;6. 新一代種群形成7. 終止條件基于遺傳編程的符號回歸示例問題示例GP實現符號回歸&#xff08;Deap&#xff09;GP實現符號回歸&…

flowable匯總查詢方式

背景&#xff1a;小程序開發申請流程。使用flowable流程框架。用戶需要在后臺統攬用戶申請的匯總表。 設計思路&#xff1a;通過查詢流程實例分頁查詢獲取數據&#xff0c; 其中可以通過查詢條件進行查詢&#xff0c;查詢條件是流程申請時添加到流程變量當中的&#xff0c;方便…

力扣438:找到字符串中所有的字母異位詞

力扣438:找到字符串中所有的字母異位詞題目思路代碼題目 給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 思路 我們先不看異位詞這個條件&#xff0c;如何在字符串s中找到字符串p。我們可以…

ruoyi-vue(十一)——代碼生成

大部分項目里其實有很多代碼都是重復的&#xff0c;幾乎每個基礎模塊的代碼都有增刪改查的功能&#xff0c;而這些功能都是大同小異&#xff0c; 如果這些功能都要自己去寫&#xff0c;將會大大浪費我們的精力降低效率。所以這種重復性的代碼可以使用代碼生成。一 代碼生成使用…