抽象工厂设计模式是什么?什么是 Abstract Factory 抽象工厂设计模式?Python 抽象工厂设计模式示例代码

什么是 Abstract Factory 抽象工厂设计模式?

抽象工厂设计模式是一种创建型设计模式,旨在提供一个创建一系列相关或相互依赖对象的接口,而无需指定其具体类。它允许客户端使用抽象的接口创建一组相关对象,而无需关注实际的对象实现。

在这里插入图片描述

主要角色:

  1. 抽象工厂(Abstract Factory): 定义了创建一组相关对象的接口,包括多个工厂方法用于创建不同类别的对象。

  2. 具体工厂(Concrete Factory): 实现了抽象工厂接口,负责创建一组具体的对象。

  3. 抽象产品(Abstract Product): 定义了一组产品对象的接口,由抽象工厂的工厂方法创建。

  4. 具体产品(Concrete Product): 实现了抽象产品接口的具体对象,由具体工厂的工厂方法创建。

在这里插入图片描述

工作流程:

  1. 定义抽象工厂接口: 定义一组创建对象的抽象方法,每个方法用于创建特定类别的对象。

  2. 创建具体工厂类: 实现抽象工厂接口,针对不同的对象族创建具体产品。

  3. 定义抽象产品接口: 定义一组产品对象的抽象方法。

  4. 创建具体产品类: 实现抽象产品接口,提供特定对象族的具体产品。

  5. 客户端使用抽象工厂: 通过抽象工厂接口创建一组相关的对象。

抽象工厂设计模式的优缺点如下:

优点:

  1. 产品族一致性: 抽象工厂能够确保相关或依赖的产品族一起工作,保证了产品的一致性和兼容性。

  2. 高层模块解耦: 客户端代码通过抽象接口与具体工厂交互,无需关注具体产品的实现细节,实现了高层模块与具体实现的解耦。

  3. 灵活性: 可以轻松替换具体工厂来改变整个产品族的行为,满足不同的业务需求。

  4. 符合开闭原则: 当需要增加新的产品族时,不需要修改已有代码,只需添加新的具体工厂即可,符合开闭原则。

缺点:

  1. 复杂性增加: 随着产品族和产品等级结构的增多,抽象工厂模式会导致类的数量急剧增加,使得系统变得复杂。

  2. 扩展困难: 增加新的产品族或产品等级结构会导致抽象工厂及其所有子类的修改,扩展性有限,容易导致代码膨胀。

  3. 单一职责原则问题: 当产品族较多时,具体工厂可能需要负责创建多个产品,违反了单一职责原则。

  4. 不易扩展新品种: 当需要添加新的产品品种时,要修改所有的具体工厂类,不够灵活。

综上所述,抽象工厂模式能够提供产品族一致性、高层模块解耦、灵活性和符合开闭原则等优点,但也会增加复杂性、扩展困难、违反单一职责原则以及不易扩展新品种等缺点。在使用时需要权衡各种因素,根据实际情况选择是否使用该模式。


Python 实现抽象工厂设计模式示例代码(一):

假设我们有一个汽车工厂,生产豪华车和普通车两种车型,每种车型又有不同的部件(引擎、轮胎等)。抽象工厂模式可以为这些不同车型的部件提供一个统一的接口。

from abc import ABC, abstractmethod# 抽象产品 - 轮胎
class Tire(ABC):@abstractmethoddef build(self):pass# 具体产品 - 豪华车轮胎
class LuxuryTire(Tire):def build(self):print("Building luxury tire")# 具体产品 - 普通车轮胎
class RegularTire(Tire):def build(self):print("Building regular tire")# 抽象工厂
class CarFactory(ABC):@abstractmethoddef create_tire(self) -> Tire:pass# 具体工厂 - 生产豪华车
class LuxuryCarFactory(CarFactory):def create_tire(self) -> Tire:return LuxuryTire()# 具体工厂 - 生产普通车
class RegularCarFactory(CarFactory):def create_tire(self) -> Tire:return RegularTire()if __name__ == "__main__":# 客户端luxury_factory = LuxuryCarFactory()luxury_tire = luxury_factory.create_tire()luxury_tire.build()  # 输出:Building luxury tireregular_factory = RegularCarFactory()regular_tire = regular_factory.create_tire()regular_tire.build()  # 输出:Building regular tire

在这个示例中,CarFactory 是抽象工厂接口,包含一个创建轮胎的抽象方法。LuxuryCarFactoryRegularCarFactory 是具体工厂,分别实现了抽象工厂接口,用于生产豪华车和普通车的轮胎。LuxuryTireRegularTire 是具体产品,分别表示豪华车和普通车的轮胎。客户端可以通过具体工厂获取特定类型车辆的轮胎。


Python 实现抽象工厂设计模式示例代码(二):

假设我们有一个电子设备制造公司,需要生产手机和电脑两种产品,每种产品需要不同类型的屏幕和处理器。我们可以使用抽象工厂模式来管理这些产品的生产。

from abc import ABC, abstractmethod# 抽象产品 - 屏幕
class Screen(ABC):@abstractmethoddef build(self):pass# 具体产品 - 手机屏幕
class PhoneScreen(Screen):def build(self):print("Building phone screen")# 具体产品 - 电脑屏幕
class ComputerScreen(Screen):def build(self):print("Building computer screen")# 抽象产品 - 处理器
class Processor(ABC):@abstractmethoddef assemble(self):pass# 具体产品 - 手机处理器
class PhoneProcessor(Processor):def assemble(self):print("Assembling phone processor")# 具体产品 - 电脑处理器
class ComputerProcessor(Processor):def assemble(self):print("Assembling computer processor")# 抽象工厂
class DeviceFactory(ABC):@abstractmethoddef create_screen(self) -> Screen:pass@abstractmethoddef create_processor(self) -> Processor:pass# 具体工厂 - 生产手机
class PhoneFactory(DeviceFactory):def create_screen(self) -> Screen:return PhoneScreen()def create_processor(self) -> Processor:return PhoneProcessor()# 具体工厂 - 生产电脑
class ComputerFactory(DeviceFactory):def create_screen(self) -> Screen:return ComputerScreen()def create_processor(self) -> Processor:return ComputerProcessor()if __name__ == "__main__":# 客户端phone_factory = PhoneFactory()phone_screen = phone_factory.create_screen()phone_processor = phone_factory.create_processor()phone_screen.build()  # 输出:Building phone screenphone_processor.assemble()  # 输出:Assembling phone processorcomputer_factory = ComputerFactory()computer_screen = computer_factory.create_screen()computer_processor = computer_factory.create_processor()computer_screen.build()  # 输出:Building computer screencomputer_processor.assemble()  # 输出:Assembling computer processor

这个示例模拟了一个设备制造公司,通过抽象工厂模式来管理手机和电脑的生产。DeviceFactory 是抽象工厂接口,定义了创建屏幕和处理器的抽象方法。PhoneFactoryComputerFactory 是具体工厂类,分别生产手机和电脑,并实现了对应的产品创建方法。PhoneScreenPhoneProcessorComputerScreenComputerProcessor 分别是具体产品类,用于表示手机和电脑的不同部件。客户端通过具体工厂获取特定类型设备的屏幕和处理器。


使用抽象工厂设计模式时,需要注意哪些地方?

在使用抽象工厂设计模式时,需要注意以下几点:

  1. 工厂方法数量: 确保抽象工厂中的方法数量不要过多,以免导致接口过于臃肿和复杂。应该根据实际情况进行适当的抽象和设计,避免过度设计。

  2. 产品族的变动: 如果需要添加新的产品族,抽象工厂和具体工厂都需要进行相应的调整和扩展,这可能导致修改工厂的代码。

  3. 产品等级结构的变动: 如果需要添加新的产品等级结构,比如新增一种类型的产品(如键盘、鼠标等),也需要修改工厂的代码来支持这些变化。

  4. 工厂选择逻辑: 客户端在使用抽象工厂模式时,可能需要选择合适的具体工厂。这个选择可能需要使用其他设计模式(如工厂方法、简单工厂等)来实现,需要谨慎设计。

  5. 对扩展的支持: 设计时应该考虑到系统的扩展性,使得新增产品或者新增产品族的支持变得容易,不会破坏原有代码结构。

  6. 合理的命名规范: 工厂、产品等命名应该清晰易懂,能够清晰表达其作用和职责,便于团队协作和维护。

  7. 充分的抽象性: 抽象工厂应该具有足够的抽象性,能够满足不同的业务需求,但又不要过度抽象,导致难以理解和应用。

  8. 单一职责原则: 每个具体工厂应该专注于创建特定类型的产品,符合单一职责原则,避免一个具体工厂负责太多不同类型产品的创建。

总的来说,使用抽象工厂模式时,需要考虑工厂方法数量、产品族和等级结构的变动、工厂选择逻辑、扩展性、命名规范、抽象性和单一职责原则等因素,合理设计和组织工厂结构,确保系统易于扩展和维护。


本文就到这里了,感谢您的阅读 。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇

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

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

相关文章

VSCode任务tasks.json中的问题匹配器problemMatcher的问题匹配模式ProblemPattern详解

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、简介 在 VS Code 中,tasks.json 文件中的 problemMatcher 字段用于定义如何解析任务输出中的问题(错误、警告等)。 problemMatcher有三种配置方式,具体可…

Java操作redis常见类型数据存储

目录 一、Java连接Redis 1.1 导入pom依赖 1.2 建立连接 二、Java使用Redis 2.1 字符串 String 2.2 哈希 Hash 2.3 列表 List 2.4 集合 Set 2.5 有序集合 Sorted Set 三、Redis的实际应用场景 一、Java连接Redis redis与mysq都是数据库,java操作redis其实跟…

2023年【施工升降机司机(建筑特殊工种)】最新解析及施工升降机司机(建筑特殊工种)考试资料

题库来源:安全生产模拟考试一点通公众号小程序 施工升降机司机(建筑特殊工种)最新解析参考答案及施工升降机司机(建筑特殊工种)考试试题解析是安全生产模拟考试一点通题库老师及施工升降机司机(建筑特殊工种)操作证已考过的学员汇总,相对有效帮助施工升…

SAP 快速Debug财务替代GGB1

本文目的是提供快速debug财务替代的步骤。 1.GGB1打开财务替代界面 2.找到需要调试的替代,并在tcode输入框中输入SHCB,回车后将显示系统自动生成的源码界面。 3.找到需要调试的步骤,设置断点,后续进行重现操作即可进入断点位置。 以上。

风电场数字孪生-升压站BIM三维模型-obj格式

简介: 风电场中的升压站三维模型,obj格式,采用BIM技术建模,可应用于风电场三维数字孪生领域,用于对升压站进行漫游浏览;三维可视化场景应用;风电场三维设计模型。 下载地址 风电场数字孪生-升…

PostgreSQL中所的锁

为了确保复杂的事务可以安全地同时运行,PostgreSQL提供了各种级别的锁来控制对各种数据对象的并发访问,使得对数据库关键部分的更改序列化。事务并发运行,直到它们尝试获取互相冲突的锁为止(比如两个事务更新同一行时)。当多个事务同时在数据…

java springboot在测试类中构建虚拟MVC环境并发送请求

好 上文java springboot在测试类中启动一个web环境我们在测试类中搭了一个web环境 那么 下面就要想办法弄一个接口的测试 这边 我们还是要在controller包下去创建一个 controller类 写一个访问接口 这里 我创建一个 TestWeb.java 这里 我们编写代码如下 package com.example.…

7.0 异常处理

1. 异常概述 1.1. 异常的概念 Java中的异常是指Java程序在运行时可能出现的错误或非正常情况,比如在程序中试图打开一个根本不存在的文件,在程序中除0等。异常是否出现,通常取决于程序的输入、程序中对象的当前状态以及程序所处的运行环境。…

Week-T10 数据增强

文章目录 一、准备环境和数据1.环境2. 数据 二、数据增强(增加数据集中样本的多样性)三、将增强后的数据添加到模型中四、开始训练五、自定义增强函数六、一些增强函数 🍨 本文为🔗365天深度学习训练营 中的学习记录博客&#x1f…

查看文件的二进制数据

有时候会遇到想查看一些文件的二进制的数据的需求,比如想看一张图片的二进制数据,想查看bin文件的二进制数据,或者想查看其它文件的二进制数据等等。 在linux和mac下有命令直接支持,比较方便,但是很多人用的是windows…

【Java 进阶篇】JavaScript JSON 语法入门:轻松理解数据的序列化和反序列化

嗨,亲爱的小白们!欢迎来到这篇关于 JavaScript 中 JSON(JavaScript Object Notation)语法的入门指南。JSON 是一种轻量级的数据交换格式,广泛应用于前端开发中。通过这篇博客,我将带你深入了解 JSON 的语法…

[userfaultfd] 2019-BalsnCTF_KrazyNote

前言 题目不算难, 但是这代码逆向可逆死个人:) 悲悲悲 程序分析 内核版本: v5.1.9 保护: 开了 kaslr, smep, smap. 现在的题目基本都开了, 都不用看. 其中 note 模块中注册了一个 misc 设备, 其函数表中就只有 note_open 和 note_unlocked_ioctl 两个函数, 其中 note_open…

C#入门(13):特性Attribute

C# 特性(Attributes)是用于在运行时为程序元素(如类、方法、属性等)添加声明性信息的一种方式。这些信息可以在程序运行时通过反射(Reflection)访问。特性可以用来控制程序行为、添加元数据或者影响程序的运…

SpringBoot趣探究--1.logo是如何打印出来的

一.前言 从本篇开始,我将对springboot框架做一个有趣的探究,探究一下它的流程,虽然源码看不懂,不过我们可以一点一点慢慢深挖,好了,下面我们来看一下本篇的知识,这个logo是如何打印出来的&#…

数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大特点分析

数字化时代银行网点厅堂营销存在以下5大特点: 1、产品多样化:在数字化时代,银行的产品和服务变得更加多样化。除了传统的存款、贷款、理财等金融服务外,还新增了各种创新产品,如网上银行、移动支付、投资咨询、保险、…

【开源】基于微信小程序的音乐平台

项目编号: S 055 ,文末获取源码。 \color{red}{项目编号:S055,文末获取源码。} 项目编号:S055,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…

开源的进销存系统都有哪些?

开源的进销存系统有很多,以下是其中一些比较流行的: OpenERP:一个集成了多个业务功能的开源ERP软件,可以实现进销存管理,会计,仓库管理,销售管理等业务功能。 Odoo:是OpenERP的一个分支&#x…

C语言进阶之冒泡排序

✨ 猪巴戒:个人主页✨ 所属专栏:《C语言进阶》 🎈跟着猪巴戒,一起学习C语言🎈 目录 前情回顾 1、回调函数 2、冒泡排序 3、库函数qsort cmp(sqort中的比较函数,需要我们自定义) …

STM32F4串口USART发送为00的解决方案

检查接线是否正确检查TX是否为复用推挽输出 3.检查是否将TX和RX引脚重映射为USART功能 在STM32中,每个GPIO引脚可以配置为不同的复用功能,例如UART、SPI、I2C等。具体来说,GPIO_PinAFConfig函数用于配置GPIO引脚的复用功能。它的参数包括GPIO…

2023年【四川省安全员A证】复审考试及四川省安全员A证考试试题

题库来源:安全生产模拟考试一点通公众号小程序 四川省安全员A证复审考试根据新四川省安全员A证考试大纲要求,安全生产模拟考试一点通将四川省安全员A证模拟考试试题进行汇编,组成一套四川省安全员A证全真模拟考试试题,学员可通过…