軟考 系統架構設計師系列知識點 —— 設計模式之抽象工廠模式

本文內容參考:

軟考 系統架構設計師系列知識點之設計模式(2)_系統架構設計師中考設計模式嗎-CSDN博客

https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/2361182

特此致謝!

Abstract Factory(抽象工廠)模式

1. 概述

抽象工廠模式(Abstract Factory Pattern)是一種常見的設計模式,隸屬于設計模式中的創建型模式,用于產品族的構建。

抽象工廠是所有形態的工廠模式中最為抽象和最具一般性的一種形態。此模式為一個產品家族提供了統一的創建接口。當需要這個產品家族的某一系列的時候,可以從抽象工廠中選出相對系的系列來創建一個具體的工廠類別。

抽象工廠是指當有多個抽象角色時使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體情況下,創建多個產品族中的產品對象。

工廠模式中的每一個形態都是針對一定問題的解決方案,工廠方法針對的是多個產品系列結構;而抽象工廠模式針對的是多個產品族結構一個產品族內有多個產品系列

2. 實現原理

抽象工廠模式相對于工廠方法模式來說,就是工廠方法模式是針對一個產品系列的,而抽象工廠模式是針對多個產品系列的,即工廠方法模式是一個產品系列一個工廠類,而抽象工廠模式是多個產品系列一個工廠類在抽象工廠模式中,客戶端不再負責對象的創建,而是把這個責任丟給了具體的工廠類,客戶端只負責對對象的調用,從而明確了各個類的職責。并且當一系列相互關聯的產品被設計到一個工廠類里后,客戶端的調用將會變得非常簡單,而且,如果要更換這一系列的產品,則只需要更換一個工廠類即可。

如果客戶端需要創建一些產品結構,而這些產品結構又分別屬于不同的產品類別,則可以使用抽象工廠模式。抽象工廠模式中抽象工廠類負責定義創建對象的接口,具體這一系列對象的創建工作由實現抽象工廠的具體工廠類來完成。

3.?角色

抽象工廠模式中存在四種角色,分別是:抽象工廠角色(AbsractFactory),具體工廠角色(ConcereteFactory),抽象產品角色(AbstractProduct),具體產品角色(ConcreteProduct)。

  • 抽象工廠角色

擔任這個角色的是工廠方法模式的核心,它是與應用系統商業邏輯無關的。

  • 具體工廠角色

這個角色直接在客戶端的調用下創建產品的實例。這個角色含有選擇合適的產品對象的邏輯,而這個邏輯是與應用系統的商業邏輯緊密相關的。

  • 抽象產品角色

擔任這個角色的類是工廠方法模式所創建的對象的父類,或它們共同擁有的接口。

  • 具體產品角色

抽象工廠模式所創建的任何產品對象都是某一個具體產品類的實例。這是客戶端最終需要的東西,其內部一定充滿了應用系統的商業邏輯。

4.?功能

抽象工廠模式的一個主要功能是它能夠隔離要生成的具體產品類, 由于這些類的實際類名部被隱藏在工廠內部,因此客戶端根本不需要關心如何對它們進行實例化的細節。每種設計模式都是針對特定問題的解決方案,而抽象工廠模式面臨的問題則是當涉及到有多個產品等級結構寸,如何更好地進行軟件體系結構的設計。

5.?代碼舉例

假設有兩種產品接口Button和Border,每一種產品都支持多種系列,比如Mac系列和Windows系列。這樣每個系列的產品分別是MacButton、WinButton、MacBorder、WinBorder。為了可以在運行時刻創建一個系列的產品族,可以為每個系列的產品族創建一個工廠MacFactory和WinFactory 。每個工廠都有兩個方法CreateButton和CreateBorder并返回對應的產品,可以將這兩個方法抽象成一個接口AbstractFactory。這樣,在運行時刻我們可以選擇創建需要的產品系列。

  • Java
public interface Button {}
public interface Border {}//實現工廠類
public class MacButton implements Button {}
public class MacBorder implements Border {}
public class WinButton implements Button {}
public class WinBorder implements Border {}//實現工廠
public class MacFactory {public static Button createButton() {return new MacButton();}public static Border createBorder() {return new MacBorder();}
}public class WinFactory {public static Button createButton() {return new WinButton();}public static Border createBorder() {return new WinBorder();}
}
  • C++
class Button; // Abstract 
Classclass MacButton: public Button {};
class WinButton: public Button {};
class Border; // Abstract 
Classclass MacBorder: public Border {};
class WinBorder: public Border {};class AbstractFactory {public:virtual Button* CreateButton() =0;virtual Border* CreateBorder() =0;
};
class MacFactory: public AbstractFactory {public:MacButton* CreateButton() { return new MacButton; }MacBorder* CreateBorder() { return new MacBorder; }
};
class WinFactory: public AbstractFactory {public:WinButton* CreateButton() { return new WinButton; }WinBorder* CreateBorder() { return new WinBorder; }
}

6.?適用情況

在以下情況可以考慮使用抽象工廠模式:

  • 一個系統要獨立于其產品的創建、組合和表示時。
  • 一個系統要由多個產品系列中的一個來配置時。
  • 需要強調一系列相關的產品對象的設計以便進行聯合使用時。
  • 提供一個產品類庫,而只想顯示它們的接口而不是實現時。

?

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

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

相關文章

P2040 打開所有的燈

題目背景 pmshz在玩一個益(ruo)智(zhi)的小游戲,目的是打開九盞燈所有的燈,這樣的游戲難倒了pmshz。。。 題目描述 這個燈很奇(fan)怪(ren),點一下就會將這個燈和其周圍四盞燈的開關狀態全部改變。現在你的任務就是就是告訴pmshz要全部打開…

漢得企業級 PaaS 平臺 H-ZERO 1.12.0 發布!四大維度升級,構建企業數字化新底座

漢得企業級 PaaS 平臺(以下簡稱"H-ZERO")是一款基于微服務架構的企業級數字化 PaaS 平臺,可支持企業各類系統搭建、產品研發,幫助企業快速構架技術中臺。 H-ZERO于2025年3月底正式發布 V1.12.0 ,此次發布聚…

ReplicaSet、Deployment功能是怎么實現的?

在Kubernetes中,ReplicaSet 和 Deployment 是用于管理 Pod 副本的關鍵對象。它們各自的功能和實現機制如下: 1. ReplicaSet 功能 管理 Pod 副本:確保指定數量的 Pod 副本一直在運行。如果有 Pod 副本崩潰或被刪除,ReplicaSet 會…

物聯網外設管理服務平臺

1 開發目標 1.1 架構圖 操作系統:基于Linux5.10.10源碼和STM32MP157開發板,完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪; 驅動層:為每個外設配置DTS并且單獨封裝外設驅動模塊。其中電壓ADC測試,采用linux內核…

PyTorch教程:如何讀寫張量與模型參數

本文演示了PyTorch中張量(Tensor)和模型參數的保存與加載方法,并提供完整的代碼示例及輸出結果,幫助讀者快速掌握數據持久化的核心操作。 1. 保存和加載單個張量 通過torch.save和torch.load可以直接保存和讀取張量。 import to…

持續集成:GitLab CI/CD 與 Jenkins CI/CD 的全面剖析

一、引言 在當今快速迭代的軟件開發領域,持續集成(Continuous Integration,CI)已成為保障軟件質量、加速開發流程的關鍵實踐。通過頻繁地將代碼集成到共享倉庫,并自動進行構建和測試,持續集成能夠盡早發現并解決代碼沖突和缺陷。而 GitLab CI/CD 和 Jenkins CI/CD 作為兩…

Python 序列構成的數組(序列的增量賦值)

序列的增量賦值 增量賦值運算符 和 * 的表現取決于它們的第一個操作對象。簡單起 見,我們把討論集中在增量加法()上,但是這些概念對 * 和其他 增量運算符來說都是一樣的。 背后的特殊方法是 iadd (用于“就地加法”&…

GEO, TCGA 等將被禁用?!這40個公開數據庫可能要小心使用了

GEO, TCGA 等將被禁用?!這40個公開數據庫可能要小心使用了 最近NIH公共數據庫開始對中國禁用的消息鬧得風風火火: 你認為研究者上傳到 GEO 數據庫上的數據會被禁用嗎? 單選 會,畢竟占用存儲資源 不會,不…

【如何自建MCP服務器?從協議原理到實踐的全流程指南】

文章目錄 如何自建MCP服務器?從協議原理到實踐的全流程指南一、MCP協議是什么?核心架構 二、為什么要自建MCP服務器?1. 突破LLM的固有局限2. 實現個性化功能擴展3. 確保數據隱私安全 三、手把手搭建MCP服務器(Python示例&#xff…

鴻蒙開發_ARKTS快速入門_語法說明_渲染控制---純血鴻蒙HarmonyOS5.0工作筆記012

然后我們再來看渲染控制 首先看條件渲染,其實就是根據不同的狀態,渲染不同的UI界面 比如下面這個暫停 開啟播放的 可以看到就是通過if 這種條件語句 修改狀態變量的值 然后我們再來看這個, 下面點擊哪個,上面橫線就讓讓他顯示哪個 去看一下代碼 可以看到,有兩個狀態變量opt…

【Java設計模式】第3章 軟件設計七大原則

3-1 本章導航 學習開辟原則(基礎原則)依賴倒置原則單一職責原則接口隔離原則迪米特法則(最少知道原則)里氏替換原則合成復用原則(組合復用原則)核心思想: 設計原則需結合實際場景平衡,避免過度設計。設計模式中可能部分遵循原則,需靈活取舍。3-2 開閉原則講解 定義 軟…

JVM即時編譯(JIT)

JVM基礎回顧 Java 作為一門高級程序語言,由于它自身的語言特性,它并非直接在硬件上運行,而是通過編譯器(前端編譯器)將 Java 程序轉換成該虛擬機所能識別的指令序列,也就是字節碼,然后運行在虛擬機之上的;…

剛體碰撞檢測與響應(C++實現)

本文實現一個經典的物理算法:剛體碰撞檢測與響應。這個算法用于檢測兩個剛體(如矩形或圓形)是否發生碰撞,并在碰撞時更新它們的速度和位置。我們將使用C來實現這個算法,并結合**邊界框(Bounding Box&#x…

常用的國內鏡像源

常見的 pip 鏡像源 阿里云鏡像:https://mirrors.aliyun.com/pypi/simple/ 清華大學鏡像:https://pypi.tuna.tsinghua.edu.cn/simple 中國科學技術大學鏡像:https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣鏡像:https://pypi.doub…

鴻蒙小案例-京東登錄

效果 代碼實現 Entry Component struct Index {build() {Column() {Row() {Image($r(app.media.jd_cancel)).width(20)Text(幫助).fontSize(16).fontColor(#666)}.width(100%).justifyContent(FlexAlign.SpaceBetween)Image($r(app.media.jd_logo)).height(250).width(250)// …

《 Scikit-learn與MySQL的深度協同:構建智能數據生態系統的架構哲學》

在機器學習工程實踐中,數據存儲與模型訓練的割裂始終是制約算法效能的關鍵瓶頸。Scikit-learn作為經典機器學習庫,其與MySQL的深度協同并非簡單的數據管道連接,而是構建了一個具備自組織能力的智能數據生態系統。這種集成突破了傳統ETL流程的…

華為AI-agent新作:使用自然語言生成工作流

論文標題 WorkTeam: Constructing Workflows from Natural Language with Multi-Agents 論文地址 https://arxiv.org/pdf/2503.22473 作者背景 華為,北京大學 動機 當下AI-agent產品百花齊放,盡管有ReAct、MCP等框架幫助大模型調用工具&#xff0…

關于軟件bug描述

軟件缺陷(Defect),常常又被叫做Bug。 所謂軟件缺陷,即為計算機軟件或程序中存在的某種破壞正常運行能力的問題、錯誤,或者隱藏的功能缺陷。缺陷的存在會導致軟件產品在某種程度上不能滿足用戶的需要。IEEE729-1983對缺…

【元表 vs 元方法】

元表 vs 元方法 —— 就像“魔法書”和“咒語”的關系 1. 元表(Metatable):魔法書 是什么? 元表是一本**“規則說明書”**,它本身是一個普通的 Lua 表,但可以綁定到其他表上,用來定義這個表應該…

Spring Boot 通過全局配置去除字符串類型參數的前后空格

1、問題 避免前端輸入的字符串參數兩端包含空格,通過統一處理的方式,trim掉空格 2、實現方式 /*** 去除字符串類型參數的前后空格* author yanlei* since 2022-06-14*/ Configuration AutoConfigureAfter(WebMvcAutoConfiguration.class) public clas…