软考 系统架构设计师系列知识点 —— 设计模式之抽象工厂模式

本文内容参考:

软考 系统架构设计师系列知识点之设计模式(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.mzph.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…