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

news/2024/4/25 19:48:17

什么是 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♪(・ω・)ノ 🍇


https://www.xjx100.cn/news/3092671.html

相关文章

C++刷题 -- 二分查找

C刷题 – 二分查找 文章目录 C刷题 -- 二分查找一、原理二、例题1.二分查找2.使用二分查找确定target左右边界3.x的平方根 一、原理 条件:数组为有序数组,数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能…

相机机模组需求示例

产品需求名称摄像头采集图片数据补充说明产品需求描述 As:用户 I want to:通过相机模组获取到自定义格式图片数据,要求包括: 1、支持多种场景,如:手持相机拍摄舌苔 2、支持图片分辨率至少达到1920X1080 3、…

【Python 千题 —— 基础篇】2 的 N 次方

题目描述 题目描述 2 的 N 次方。输入一个整数 N,使用 for 循环计算 2 的 N 次方的值。 输入描述 输入一个整数值 N。 输出描述 输出 2 的 N 次方的值。 示例 示例 ① 输入: 20输出: 请输入一个整数 N: 20 2 的 20 次方的值是: 10…

UE必学系列(基础篇完结)

导语: UE必须系列基础篇完结,敬请期待进阶篇 基础篇文章:在掌握了UE4基础操作,并且能上手做一些项目之后,对UE4知识进行更完善的知识体系学习。主要是把学习视频链接汇总,主要学习思路是 优先官方视频和官…

gitlab图形化界面使用

gitlab使用 创建用户 上面是创建用户基本操作 修改密码 创建组 给组添加用户 创建项目 选择空白项目 退出root用户,切换其他用户 在服务器上创建ssh密钥 使用ssh-ketgen 命令 新服务器上创建的 [rootgitlab ~]# ssh-keygen Generating public/private rsa key …

Redis从入门到精通(二)- 入门篇

文章目录 0. 前言1. 入门篇[【入门篇】1.1 redis 基础数据类型详解和示例](https://icepip.blog.csdn.net/article/details/134438573)[【入门篇】1.2 Redis 客户端之 Jedis 详解和示例](https://icepip.blog.csdn.net/article/details/134440061)[【入门篇】1.3 redis客户端之…

链路聚合-静态和动态区别

链路聚合之动静态聚合方式 链路聚合组是由一组相同速率、以全双工方式工作的网口组成。 1、动态聚合: 动态聚合对接的双方通过交互LACP(链路聚合控制协议)协议报文,来协商聚合对接。 优点:对接双方相互交互端口状态信息,使端口…

梯度引导的分子生成扩散模型- GaUDI 评测

GaUDI模型来自于以色列理工Tomer Weiss的2023年发表在预印本ChemRxiv上的工作 《Guided Diffusion for Inverse Molecular Design》。原文链接:Guided Diffusion for Inverse Molecular Design | Materials Chemistry | ChemRxiv | Cambridge Open Engage GaUDI模型…