抽象工厂设计模式是什么?什么是 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其实跟…

vue项目不用重新打包即可以修改项目ip

需求: 由于vue项目每次修改项目ip都需要重新打包,解决痛点: 方法: vue项目的dev.env.js配置文件引入外部变量 node中使用CommonJS规范引入 导出 static文件下新建host文件 static为暴露到外包的静态资源文件夹 /static/host/下…

黑盒子测试

黑盒子测试的步骤包括: 测试计划:根据用户需求报告中关于功能要求和性能指标的规格说明书,定义相应的测试需求报告,制订黑盒测试的最高标准。同时适当选择测试内容,合理安排测试人员、测试时间及测试资源等。测试设计…

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

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

星戈瑞Sulfo-Cyanine5 mal的优势和局限性

Sulfo-Cyanine5 Maleimide(Sulfo-Cy5-Mal)是一种荧光染料,在分子生物学和细胞生物学研究中应用。 优势: 1.强荧光信号:Sulfo-Cy5-Mal具有强烈的荧光信号,适用于高灵敏度的荧光成像和检测。其荧光波长适用…

【开题报告】基于微信小程序的时空胶囊系统的设计与实现

1.研究背景 随着人们生活水平的提高和物质条件的改善,人们对于生活的品质和价值的要求也不断提高。人们开始更加注重记录自己的生活经历和感受,并且希望这些记录可以长期保存,并且可以随时回忆和分享。时空胶囊系统就是一个能够满足人们这种…

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 的语法…

Android插件化技术的原理与实现

引言 随着移动应用的快速发展,Android插件化技术成为了一个热门话题。插件化技术可以实现动态加载和卸载代码,提高应用的灵活性和可扩展性。本文将详细介绍Android插件化技术的核心原理,并提供相关的代码示例。 一、插件化技术的概述 1. 什…

uniapp前端微信支付代码

1.支付按钮&#xff0c;定义支付事件 <u-button text"立即抢购" click"payTap" shape"circle" color"#E10000"></u-button>2.支付事件 // 这些参数根据后端需要什么就传什么&#xff0c;一般有用户id和订单号就行&#x…

【华为OD题库-031】比赛的冠亚季军-java

题目 有N(3<N<10000)个运动员&#xff0c;他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛&#xff0c;需要决出冠亚军。比赛的规则是0号和1号比赛&#xff0c;2号和3号比赛&#xff0c;以此类推&#xff0c;每一轮&#xff0c;相邻的运动员进行比赛&#…

[userfaultfd] 2019-BalsnCTF_KrazyNote

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

C#入门(13):特性Attribute

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