设计模式(创建型)-抽象工厂模式

摘要

        在软件开发的复杂世界中,设计模式作为解决常见问题的最佳实践方案,一直扮演着至关重要的角色。抽象工厂模式,作为一种强大的创建型设计模式,在处理创建一系列或相关依赖对象的场景时,展现出了独特的优势和灵活性。它通过提供一个创建对象的接口,让开发者能够在不指定具体类的情况下构建对象,有效地解耦了对象的创建和使用过程,使得系统更加易于维护和扩展。

定义

        抽象工厂模式的核心定义是提供一个创建一系列或相关依赖对象的接口,而无需指定它们具体的类。这意味着在一个复杂的系统中,当存在多个相关对象的创建需求,并且这些对象之间存在依赖关系或需要协同工作时,抽象工厂模式能够派上用场。

        例如,在一个游戏引擎中,可能需要创建不同类型的角色、武器和装备,并且这些游戏元素之间存在着相互依赖的关系,比如特定的角色需要特定的武器才能发挥最佳效果。抽象工厂模式就可以通过定义一个统一的工厂接口,由具体的工厂子类来负责创建这些相关的游戏元素,从而简化了对象创建的过程,同时保证了对象之间的一致性和协调性。

类图

角色

抽象工厂角色

        抽象工厂角色描述了具体工厂的公共接口,它是所有具体工厂类的父类。这个接口定义了创建一系列产品对象的抽象方法,这些方法并不包含具体的创建逻辑,而是由具体的工厂子类来实现。例如,在一个电子产品制造系统中,抽象工厂可能定义了创建手机、电脑和平板等电子产品的抽象方法,而具体的华为工厂子类和小米工厂子类则会根据自身的产品特点来实现这些方法,创建出相应品牌的手机、电脑和平板。抽象工厂角色的存在使得系统具有更好的扩展性和可维护性,当需要添加新的产品系列时,只需要创建一个新的具体工厂子类并实现抽象工厂接口中的方法即可,而无需修改其他已有的代码。

具体工厂角色

        具体工厂角色是负责创建产品实例的类,它主要实现了抽象工厂中定义的抽象方法,完成具体产品的创建过程。每个具体工厂类都对应着一个特定的产品系列,例如华为工厂负责创建华为品牌的各种电子产品,小米工厂负责创建小米品牌的相关产品。具体工厂类熟知如何创建该系列下的所有产品对象,并且保证这些产品对象之间的兼容性和协作性。在实际应用中,客户端通过调用具体工厂类的方法来获取所需的产品对象,而无需关心产品对象的具体创建细节,这大大降低了客户端代码与产品创建逻辑之间的耦合度。

抽象产品角色

        抽象产品角色是简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。引入抽象产品角色可以显著提高系统的灵活性,因为在工厂类中只需定义一个通用的工厂方法,就可以创建各种具体产品对象,只要这些具体产品对象都是抽象产品角色的子类。以电子产品为例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE】-- SpringBoot快速上手

文章目录 1. Maven1.1 什么是Maven1.2 为什么要学Maven1.3 创建一个Maven项目1.4 Maven核心功能1.4.1 项目创建1.4.2 依赖管理1.4.3 Maven Help插件 1.5 Maven仓库1.5.1 本地仓库1.5.2 中央仓库1.5.3 私有服务器(私服) 1.6 Maven设置国内源1.6.1 配置当前…

TCP/IP 协议精讲-精华总结版本

序言 本文旨在介绍一下TCP/IP涉及得所有基础知识,为大家从宏观上俯瞰TCP/IP提供一个基石,文档属于《TCP/IP图解(第五版)》的精简版本。 专业术语 缩写 全称 WAN Wide area network广域网 LAN Local area network局域网 TC…

Leetcode 160 Intersection of Two Linked Lists

题意 给定两个链表,找这两个链表第一个公共节点,如果没有返回nullptr 题目链接 https://leetcode.com/problems/intersection-of-two-linked-lists/description/ 题解 两个指针分别从两个链表(记录为表A,表B)的表…

C语言——结构体、联合、枚举

C语言中自定义类型 结构体结构体变量的创建和初始化结构体传参结构体内存对齐(如何存储) 联合体(共用体)联合体创建和初始化联合体大小(如何存储) 枚举类型枚举类型创建枚举类型初始化枚举的优点(相较于define) 前言 C语言中有内置类型和自定义类型,内置类型就像int…

利用pprof对golang进行性能分析

利用pprof进行性能分析 pprof性能分析的5个方面 一、性能分析的五个核心维度 CPU分析 - 剖析程序的CPU使用情况,定位高耗时函数 内存分析 - 追踪内存分配与泄露,优化内存使用模式 IO分析 - 监控文件/网络IO操作,发现瓶颈资源 Goroutine分…

IntelliJ IDEA 调试技巧指南

在日常开发中,调试是不可或缺的一部分。掌握调试工具的使用可以让我们更高效地定位和解决问题。本文将介绍一些在 IntelliJ IDEA 中常用的调试技巧,希望能帮助你在开发过程中更顺畅地解决问题。 1. 方法断点:快速定位实现类 方法断点可以帮…

gitlab 提交pr

在 GitLab 中,提交合并请求(Merge Request, MR)的大致流程如下: 1. 创建新分支 如果你还没有创建新的功能分支,可以使用以下命令创建并切换到新分支: git checkout -b feature-branch说明:f…

halcon几何测量(二)计算距离和角度的函数

目录 一、计算两条线之间的夹角二、计算一条直线和水平轴之间的夹角三、计算两个轮廓之间的最小距离四、计算两个轮廓之间的最小距离和对应的点五、计算直线和区域之间的最小和最大距离六、计算点到轮廓线之间的距离七、计算点到直线的距离八、计算点到点的距离九、计算点和区域…

【Linux操作系统——学习笔记二】Linux简单导航命令操作

一、前言 学习Linux,本质上是学习在命令行下熟练使用Linux的各类命令。 命令行:是一种通过输入命令和参数与计算机系统进行交互的方式,可以使用各种字符化命令对系统发出操作指令,打开Linux终端,进入命令行界面。 …

新安装的cursor安装不了插件

我安装的cursor版本0.47.5 直接说解决办法 找到安装路径cursor\resources\app下的product.json 修改https://marketplace.cursorapi.com为https://marketplace.visualstudio.com

算法基础篇(蓝桥杯常考点)

算法基础篇 前言 算法内容还有搜索,数据结构(进阶),动态规划和图论 数学那个的话大家也知道比较难,放在最后讲 这期包含的内容可以看目录 模拟那个算法的话就是题说什么写什么,就不再分入目录中了 注意事…

《解锁华为黑科技:MindSpore+鸿蒙深度集成奥秘》

在数字化浪潮汹涌澎湃的当下,人工智能与操作系统的融合已成为推动科技发展的核心驱动力。华为作为科技领域的先锋,其AI开发框架MindSpore与鸿蒙系统的深度集成备受瞩目,开启了智能生态的新篇章。 华为MindSpore:AI框架的创新先锋…

双3060、Ubuntu22.04、cuda12.8安装deepseek 32b-Q8

以下是针对双RTX 3060显卡(12GB显存)在Ubuntu 22.04系统部署DeepSeek-R1-32b-qwen-distill-q8模型的完整流程,结合最新技术规范与魔塔社区资源: 一、驱动与CUDA环境配置 1. 禁用开源驱动 bash sudo tee /etc/modprobe.d/blackli…

K8S学习之基础三十四:K8S之监控Prometheus部署pod版

使用 Kubernetes Pod 的方式部署 Prometheus 是一种常见的方法,尤其是在容器化和微服务架构中。以下是详细的步骤: 1. 创建命名空间(可选) 为了方便管理,可以为 Prometheus 创建一个单独的命名空间。 yaml 复制 a…

Linux top 命令详解:从入门到高级用法

Linux top 命令详解:从入门到高级用法 在 Linux 系统中,top 是一个强大的实时监控工具,用于查看系统资源使用情况和进程状态。它可以帮助你快速了解 CPU、内存、负载等信息,是系统管理员和开发者的日常利器。本文将从基本用法开始…

uniapp-x vue 特性

生命周期 在组合式API中,组件可以监听应用和页面的生命周期。但由于应用和页面都有onShow和onHide,导致重名。所以在组合式的组件中监听页面的显示隐藏,改为了onPageShow和onPageHide。 这个和uniapp不一样,uniapp自定义组件无法…

HTML5扫雷游戏开发实战

HTML5扫雷游戏开发实战 这里写目录标题 HTML5扫雷游戏开发实战项目介绍技术栈项目架构1. 游戏界面设计2. 核心类设计 核心功能实现1. 游戏初始化2. 地雷布置算法3. 数字计算逻辑4. 扫雷功能实现 性能优化1. DOM操作优化2. 算法优化 项目亮点技术难点突破1. 首次点击保护2. 连锁…

Qt之自定义界面组件 一

通过qt中的painter绘图事件绘制一个电池电量图的变化。效果如下图 创建一个基于界面widget工程,在wdiget界面添加一个widget界面,将添加的widget界面的类提升为Tbattery.在Tbattery类中重写painEvent电池电量代码 文件目录结构 主要部分代码 //Tbattery.cpp #inc…

LeRobot源码剖析——对机器人各个动作策略的统一封装:包含ALOHA ACT、Diffusion Policy、VLA模型π0

前言 过去2年多的深入超过此前7年,全靠夜以继日的勤奋,一天当两天用,抠论文 抠代码 和大模型及具身同事讨论,是目前日常 而具身库里,idp3、π0、lerobot值得反复研究,故,近期我一直在抠π0及l…

数据结构篇——线索二叉树

一、引入 遍历二叉树是按一定规则将二叉树结点排成线性序列,得到先序、中序或后序序列,本质是对非线性结构线性化,使结点(除首尾)在线性序列中有唯一前驱和后继;但以二叉链表作存储结构时,只能获…