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

news2024/11/18 5:56:05

什么是 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):
    @abstractmethod
    def 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):
    @abstractmethod
    def 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 tire

    regular_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):
    @abstractmethod
    def 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):
    @abstractmethod
    def 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):
    @abstractmethod
    def create_screen(self) -> Screen:
        pass

    @abstractmethod
    def 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 screen
    phone_processor.assemble()  # 输出:Assembling phone processor

    computer_factory = ComputerFactory()
    computer_screen = computer_factory.create_screen()
    computer_processor = computer_factory.create_processor()

    computer_screen.build()  # 输出:Building computer screen
    computer_processor.assemble()  # 输出:Assembling computer processor

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


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

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

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

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

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

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

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

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

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

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

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


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

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

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

相关文章

XDAG同步节点部署

系统环境要求 JDK : v17 Maven : v3.9.1-v3.9.5 MySQL : v8.0系列 1、MySQL8.0安装 1)docker-compose安装详情 MySQL安装 2)配置数据库账号密码及键表 # docker exec -it mysql8 /bin/bash # root0286a1fd60e6:/# mysql -uroot -p Enter password:…

【开源】基于Vue.js的教学过程管理系统

项目编号: S 054 ,文末获取源码。 \color{red}{项目编号:S054,文末获取源码。} 项目编号:S054,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2…

YOLOv7训练:_pickle.UnpicklingError: STACK_GLOBAL requires str

在YOLOv7训练过程中,出现以下错误: 原因就是: 这个数据集在其他地方运行过产生了**.cache**文件 解决方案(亲测有效): 删除数据集中的所有 label.cache文件,比如训练集、验证集、测试集都删…

【AICFD案例教程】IGBT对流换热分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件,用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程,帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

【JavaEE初阶】 JavaScript基础语法——贰

文章目录 🌲条件语句🚩if 语句🚩三元表达式🚩switch🚩循环语句🎈while 循环🎈continue🎈break🎈for 循环 🍀数组🚩创建数组🚩获取数组…

【cpolar】TortoiseSVN如何安装并实现公网提交文件到本地SVN服务器

🎥 个人主页:深鱼~ 🔥收录专栏:cpolar 🌄欢迎 👍点赞✍评论⭐收藏 文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控…

数据结构——散列表

参考书籍: 《数据结构与抽象:Java语言描述》 第四版 一、背景知识 散列(hashing):是仅利用项的查找键,无需查找就可确定其下标的一项技术散列表(hash table):数组散列索引…

设计循环队列(c语言)

前言 在上一篇文章中我们了解了关于循环队列的基本特性: 1、当rear front时,表示队列为空 2、当rear 1 front时,表示队列已满 当我们需要实现循环队列时,通常会选择使用链表或数组来存储队列中的元素。而使用数组来实现循环队…

OGG-01224 Address already in use 问题

ERROR OGG-01224 Oracle GoldenGate Manager for Oracle, mgr.prm: Address already in use. ERROR OGG-01668 Oracle GoldenGate Manager for Oracle, mgr.prm: PROCESS ABENDING. 查看端口被占用情况: [rootcenterone ogg]# lsof -i:7809原因mgr 7809 端口被占…

日常办公:批处理编写Word邮件合并获取图片全路径

大家在使用Word邮件合并这个功能,比如制作席卡、贺卡、准考证、员工档案、成绩单、邀请函、名片等等,那就需要对图片路径进行转换处理,此脚本就是直接将图片的路径提取出来,并把内容放到txt格式的文本文档里,打开Excel…

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

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

Halcon Solution Guide I basics(0): 导论解析

文章目录 文章专栏前言文章目录翻译文档的说明 结论LOL比赛结局 文章专栏 Halcon开发 前言 今天开始看Halcon的官方文档。由于市面上的教学主要是以基础的语法,算子简单介绍为主。所以我还是得看官方的文本。别的不多说了。有道词英语词典,启动。 还有…

数字IC基础:有符号数和无符号数的加减运算

相关阅读 数字IC基础https://blog.csdn.net/weixin_45791458/category_12365795.html?spm1001.2014.3001.5482 首先说明,本篇文章并不涉及补码运算正确性的证明,仅是对补码运算在有符号数和无符号数中运行进行讨论。 补码运算最大的作用在于消除计算机…

线程池有几种创建方式?

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

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

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

【C语言】数据结构——栈和队列实例探究

💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读:一、 栈1. 栈的概念及结构2. 栈的实现3. 实现代码3.1 定义结构体3.2 初始化栈3.3 销毁栈3.4 入栈3.5 出栈…

2023年G3锅炉水处理证考试题库及G3锅炉水处理试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2023年G3锅炉水处理证考试题库及G3锅炉水处理试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大纲随机…

【数据结构】栈和队列的模拟实现

前言:前面我们学习了单链表并且模拟了它的实现,今天我们来进一步学习,来学习栈和队列吧!一起加油各位,后面的路只会越来越难走需要我们一步一个脚印! 💖 博主CSDN主页:卫卫卫的个人主页 &#x…

提升--09-1--AQS底层逻辑实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、怎么解释AQS是什么?AQS的本质是JUC包下一个抽象类,AbstractQueuedSynchronizer (抽象的队列式同步器) 二、AQS核…

基于霍克斯过程的限价订单簿模型下的深度强化学习做市策略

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学,点击下方链接报名: 量化投资速成营(入门课程) Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…