Python设计模式详解之3 —— 抽象工厂模式

embedded/2024/11/19 22:43:50/

抽象工厂模式也是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。它特别适合在需要创建多个相关对象且这些对象在逻辑上属于一个“产品族”时使用。

结构:
  • 抽象产品:定义了产品家族中每个产品的接口。
  • 具体产品:实现抽象产品接口的具体类。
  • 抽象工厂:声明了创建一系列相关产品的方法。
  • 具体工厂:实现抽象工厂接口,提供具体产品的实例。
实现方式:
python">from abc import ABC, abstractmethod# 抽象产品类
class Chair(ABC):@abstractmethoddef sit_on(self):passclass Sofa(ABC):@abstractmethoddef lie_on(self):pass# 具体产品类
class VictorianChair(Chair):def sit_on(self):return "Sitting on a Victorian Chair."class ModernChair(Chair):def sit_on(self):return "Sitting on a Modern Chair."class VictorianSofa(Sofa):def lie_on(self):return "Lying on a Victorian Sofa."class ModernSofa(Sofa):def lie_on(self):return "Lying on a Modern Sofa."# 抽象工厂类
class FurnitureFactory(ABC):@abstractmethoddef create_chair(self):pass@abstractmethoddef create_sofa(self):pass# 具体工厂类
class VictorianFurnitureFactory(FurnitureFactory):def create_chair(self):return VictorianChair()def create_sofa(self):return VictorianSofa()class ModernFurnitureFactory(FurnitureFactory):def create_chair(self):return ModernChair()def create_sofa(self):return ModernSofa()# 使用示例
factory = VictorianFurnitureFactory()
chair = factory.create_chair()
sofa = factory.create_sofa()
print(chair.sit_on())  # 输出 "Sitting on a Victorian Chair."
print(sofa.lie_on())   # 输出 "Lying on a Victorian Sofa."
优点:
  • 一致性:确保同一产品族的对象之间可以协作。
  • 解耦:客户端代码与具体类解耦,使得代码更灵活和易于维护。
  • 符合开闭原则:添加新的产品族时,只需添加新的具体工厂类即可,无需修改已有代码。
缺点:
  • 复杂性增加:需要为每个产品族定义新的具体工厂,类的数量会显著增加。
  • 扩展困难:增加新的产品接口(如添加Table)需要修改所有的工厂接口及其实现。
适用场景:
  • 系统需要创建一系列相关的产品对象,而这些对象在逻辑上属于一个产品族。
  • 系统希望提供产品族的多个变体,但保证客户端只使用同一变体的对象。

抽象工厂模式 vs. 简单工厂模式 vs. 工厂方法模式

  1. 简单工厂模式

    • 创建对象方式:通过一个工厂类的静态方法根据输入创建对象。
    • 优点:实现简单,易于使用。
    • 缺点:不符合开闭原则,扩展性差。
    • 适用场景:适合创建少量、简单对象的场景。
  2. 工厂方法模式

    • 创建对象方式:通过子类实现的工厂方法创建具体对象。
    • 优点:符合开闭原则,每新增产品只需扩展具体工厂类。
    • 缺点:增加了实现复杂度和类的数量。
    • 适用场景:适合创建多种对象,且需要易于扩展的场景。
  3. 抽象工厂模式

    • 创建对象方式:通过具体工厂创建一系列相关或相互依赖的对象。
    • 优点:能够保证同一产品族对象的协作一致性,符合开闭原则。
    • 缺点:实现复杂,扩展产品结构较困难。
    • 适用场景:适合需要创建一系列相关对象的场景,确保产品之间的一致性。

总结对比:

  • 简单工厂模式更适合简单和小规模的对象创建需求,缺乏扩展性。
  • 工厂方法模式提供了更高的灵活性,允许创建不同类型的对象,但实现上增加了类的复杂度。
  • 抽象工厂模式适合复杂系统中需要创建多个相关产品族的场景,保障产品族内对象的一致性,尽管它在实现上最为复杂。

http://www.ppmy.cn/embedded/138887.html

相关文章

《大数据中的分布式数据库》

一、引言 在当今大数据时代,数据量呈爆炸式增长,传统的集中式数据库已经难以满足大规模数据存储和处理的需求。分布式数据库作为一种新兴的数据库技术,能够有效地解决大数据带来的挑战,为企业提供高可扩展性、高可用性和高性能的数…

报错java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not ...解决方法

在运行项目时出现java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualidzz这样的报错 解决方法 1.第一步:在pom文件中将lombok的版本改成最新的 此时1.18.34是新…

单体架构和微服务架构到底哪个好?

单体和微服务谁是毒瘤?单体、分布式、微服务、SOA到底是什么关系?我的系统该用什么架构?最近终于下定决心研究这个问题并且有所收获,欢迎一起讨论。 一、架构的发展历程 我坚定的认为要深刻的理解一项技术光靠网上一两张按照各项…

sql 根据身份证号获取出生日期并转成对应格式

sql server 查询判断身份证号是18位的 select SUBSTRING(SUBSTRING(IDCard,7,8),1,4)-SUBSTRING(SUBSTRING(IDCard,7,8),5,2)-SUBSTRING(SUBSTRING(IDCard,7,8),7,2) from 表 where Birthday is null and LEN(IDCard)18 修改 update 表set BirthdaySUBSTRING(SUBSTRING…

kafka:使用flume自定义拦截器,将json文件抽取到kafka的消息队列(topic)中,再从topic中将数据抽取到hdfs上

抽取trans_info.json的数据到kafka上,对其中的tr_flag0的数据进行过滤抛弃,只保留正常的状态数据: 将此json文件放在集群中的 /home/zidingyi/trans_info.json 目录下 首先先在java代码中自定义拦截器: 1)&#xff1…

服务器开机即占用大量内存,解决

1.服务器开机两分钟不到,内存使用飙升 [rootlocalhost ~]# top #查看是否有了明显的内存占用程序 2.上述未果,查看是否有违规的开机自启项 [rootlocalhost ~]# chkconfig --list 3.上述无果,查看开启启动加载项内容 上网搜后&#xff…

《深度学习》VGG网络

文章目录 1.VGG的网络架构2.案例:手写数字识别 学习目标: 知道VGG网络结构的特点能够利用VGG网络完成图像分类 2014年,⽜津⼤学计算机视觉组(Visual Geometry Group)和GoogleDeepMind公司的研究员⼀起研发出了新的深度…

第五章 Vue 组件与生命周期

学习目标 5.1 Vue组件5.1.1 为什么要使用组件5.1.2 组件入门5.1.2.1 全局组件5.1.2.2 局部组件 5.2 组件通讯5.2.1 父子组件定义5.2.2 父组件给子组件传值5.2.3 子组件给父组件传值5.2.4 单向数据流 5.3 插槽5.3.1 匿名插槽5.3.2 具名插槽 5.4 生命周期钩子函数5.4.1 生命周期图…