Python 抽象工厂模式介绍、使用

一、抽象工厂模式介绍

概念:

Python 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的方式,用于创建一系列相关或相互依赖的对象。它为客户端提供了一种创建对象的接口,而不需要指定具体实现。

功能:

抽象工厂模式提供了一种创建一系列相关或相互依赖的对象的方式,使得对象的创建与使用分离开来,从而提高了代码的灵活性和可维护性。

优点:

  1. 抽象工厂模式可以帮助我们更好地组织代码,提高代码的可维护性和可扩展性。
  2. 抽象工厂模式可以将对象的创建与使用分离开来,使得对象的创建更加灵活和可控。
  3. 抽象工厂模式可以保证一系列相关的对象都能够被正确创建和使用。
  4. 抽象工厂模式可以帮助我们实现代码的解耦合,使得代码更加清晰、易于理解。

缺点:

  1. 抽象工厂模式的实现需要一定的编程经验和技巧,需要额外的工作量和学习成本。
  2. 抽象工厂模式的实现可能会增加代码的复杂性,特别是在需要创建大量对象时。

抽象工厂模式通常应用于以下场景:

  1. 需要创建一系列相关或相互依赖的对象。
  2. 需要在不同的操作系统或平台上使用不同的实现。
  3. 需要提供一种灵活的创建对象的方式,以便更好地组织代码。

使用方式:

抽象工厂模式的实现需要定义一个抽象工厂类和多个具体工厂类,每个具体工厂类都可以创建一系列相关的对象,具体工厂类都需要实现抽象工厂类中定义的创建方法。

抽象工厂模式在应用程序开发中经常被使用,例如:

  1. GUI界面开发中,可以使用抽象工厂模式创建不同的UI控件。
  2. 游戏开发中,可以使用抽象工厂模式创建不同类型的游戏角色。
  3. 数据库访问层中,可以使用抽象工厂模式创建不同的数据库驱动程序。
  4. 操作系统API开发中,可以使用抽象工厂模式创建不同的系统调用。

二、使用

示例一:

下面以制造汽车为例,说明Python 抽象工厂模式的使用方式。假设我们需要制造两种不同种类的汽车:基础版和高级版,每种汽车又可以分为两个品牌:A品牌和B品牌,其中每个品牌有引擎、轮胎和座椅三个部件。

首先,我们需要定义抽象工厂类和多个具体工厂类,如下所示:

然后,我们需要定义每个部件的抽象基类和具体实现类,如下所示:

最后,在客户端调用程序中,我们可以通过实例化不同的具体工厂类来创建不同品牌的汽车,如下所示:

# 步骤一:定义抽象工厂类
class carFac():# 定义抽象工厂类def create_engine(self):# 引擎passdef create_tire(self): # 轮胎passdef create_seat(self): # 座椅pass# 步骤二:定义具体工厂类
class carFacA(carFac): # 定义具体工厂类:继承抽象工厂类,实现抽象工厂类定义的创建方法,返回抽象基类定义的方法def create_engine(self):  # 引擎return engineA()def create_tire(self):  # 轮胎return tireA()# def create_seat(self):  # 座椅#     return seatA()class carFacB(carFac):def create_engine(self):  # 引擎return engineB()def create_tire(self):  # 轮胎return tireB()# def create_seat(self):  # 座椅#     return seatB()#步骤三: 定义抽象基类的具体实现方法
class engine():  # 定义抽象基类def work(self):passclass engineA(engine):  # 定义具体实现类def work(self):print("engine A is working...")class engineB(engine):def work(self):print("engine B is working...")class tire():  # 定义抽象基类def run(self):passclass tireA(tire):  # 定义具体实现类def run(self):print("tire A is runing...")class tireB(tire):def run(self):print("tire B is runing...")fac1 = carFacA()
eng1 = fac1.create_engine()
tir1 = fac1.create_tire()
eng1.work()
tir1.run()fac2 = carFacB()
eng2 = fac2.create_engine()
tir2 = fac2.create_tire()
eng2.work()
tir2.run()

运行结果:

engine A is working...
tire A is runing...
engine B is working...
tire B is runing...

上述程序中,客户端通过实例化不同的具体工厂类,即可创建不同品牌的汽车,每个汽车又都由引擎、轮胎和座椅三个部件组成,这些部件都是由具体实现类完成的。这样,我们就成功地使用抽象工厂模式实现了汽车的制造过程。

示例二:

下面以操作系统系统调用为例,说明Python 使用抽象工厂模式创建不同的系统调用。假设我们有两个操作系统,分别为Windows和Linux,我们需要在两个操作系统上实现不同的系统调用。

首先,我们需要定义抽象工厂类和多个具体工厂类,如下所示:

# 定义抽象工厂类
class SystemCallFactory():def create_open(self):passdef create_read(self):passdef create_write(self):pass# 定义具体工厂类WindowsSystemCallFactory
class WindowsSystemCallFactory(SystemCallFactory):def create_open(self):return WindowsOpen()def create_read(self):return WindowsRead()def create_write(self):return WindowsWrite()# 定义具体工厂类LinuxSystemCallFactory
class LinuxSystemCallFactory(SystemCallFactory):def create_open(self):return LinuxOpen()def create_read(self):return LinuxRead()def create_write(self):return LinuxWrite()

然后,我们需要定义每个系统调用的抽象基类和具体实现类,如下所示:

# 定义打开文件系统调用抽象基类
class Open():def open_file(self):pass# 定义Windows打开文件系统调用具体实现类
class WindowsOpen(Open):def open_file(self):print("Windows open file...")# 定义Linux打开文件系统调用具体实现类
class LinuxOpen(Open):def open_file(self):print("Linux open file...")# 定义读取文件系统调用抽象基类
class Read():def read_file(self):pass# 定义Windows读取文件系统调用具体实现类
class WindowsRead(Read):def read_file(self):print("Windows read file...")# 定义Linux读取文件系统调用具体实现类
class LinuxRead(Read):def read_file(self):print("Linux read file...")# 定义写入文件系统调用抽象基类
class Write():def write_file(self):pass# 定义Windows写入文件系统调用具体实现类
class WindowsWrite(Write):def write_file(self):print("Windows write file...")# 定义Linux写入文件系统调用具体实现类
class LinuxWrite(Write):def write_file(self):print("Linux write file...")

最后,在客户端调用程序中,我们可以通过实例化不同的具体工厂类来创建不同操作系统上的系统调用,如下所示:

# 客户端程序
if __name__ == '__main__':factory1 = WindowsSystemCallFactory()open1 = factory1.create_open()read1 = factory1.create_read()write1 = factory1.create_write()open1.open_file()read1.read_file()write1.write_file()factory2 = LinuxSystemCallFactory()open2 = factory2.create_open()read2 = factory2.create_read()write2 = factory2.create_write()open2.open_file()read2.read_file()write2.write_file()

上述程序中,客户端通过实例化不同的具体工厂类,即可创建不同操作系统上的系统调用,每个系统调用又都由打开文件、读取文件和写入文件三个基本操作组成,这些操作都是由具体实现类完成的。这样,我们就成功地使用抽象工厂模式实现了在不同操作系统上的系统调用。

运行结果:

Windows open file...
Windows read file...
Windows write file...
Linux open file...
Linux read file...
Linux write file...

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

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

相关文章

【微服务架构设计】微服务不是魔术:处理超时

微服务很重要。它们可以为我们的架构和团队带来一些相当大的胜利,但微服务也有很多成本。随着微服务、无服务器和其他分布式系统架构在行业中变得更加普遍,我们将它们的问题和解决它们的策略内化是至关重要的。在本文中,我们将研究网络边界可…

使用贝叶斯算法完成文档分类问题

贝叶斯原理 贝叶斯原理(Bayes theorem)是一种用于计算条件概率的数学公式。它是以18世纪英国数学家托马斯贝叶斯(Thomas Bayes)的名字命名的。贝叶斯原理表达了在已知某个事件发生的情况下,另一个事件发生的概率。具体…

二十三种设计模式第十七篇--迭代子模式

迭代子模式是一种行为型设计模式,它允许你按照特定方式访问一个集合对象的元素,而又不暴露该对象的内部结构。迭代子模式提供了一种统一的方式来遍历容器中的元素,而不需要关心容器的底层实现。 该模式包含以下几个关键角色: 迭…

计算机网络(1) --- 网络介绍

目录 1.介绍协议 基础知识 协议 协议分层 OSI七层模型 2.TCP/IP五层模型 3.网络传输的基本流程 1.基本知识 协议报头 2.局域网通信的基本流程 3.网络传输流程 局域网分类 跨路由器传输 数据包封装和分用 4.网络中的地址管理 1.IP地址 2.MAC地址 3.区别 1.介绍…

Linux/Windows路由管理

本文主要介绍如果通过linux/Windows命令添加IPV6地址&#xff0c;查看添加IPV6默认路由&#xff0c;查看IPV6邻居缓存 一、Linux 1、查看地址 IPV4: route netstat -route ip route IPV6: ip -6 route show route -A inet6 route -62、添加IPV6地址 ip -6 addr add <…

训练自己的行文本检测EAST模型

训练自己的行文本检测EAST模型 训练数据格式 训练数据格式

成员方法(类方法)的使用细节与注意事项

目录 1.方法的调用机制原理图 2.访问修饰符 3.返回类型 4.形参列表 5.方法体

模糊神经网络机械故障诊断(MATLAB代码)

效果 用训练好的模糊神经网络对机械故障进行诊断,根据网络的预测值得到机械的技术状态。预测值小于 1.5 时为正常状态,预测值在 1.5~2.5 之间时为曲轴轴承轻微异响,预测值在 2.5~3.5 之间时为曲轴轴承严重异响预测值在 3.5~4.5 之间时为连杆轴承轻微异响,预测值大于 4.5 时为连…

选好NAS网络储存解决方案,是安全储存的关键

随着网络信息的发展&#xff0c;NAS也越来越受到企业的关注&#xff0c;NAS网络存储除了提供简单的存储服务外&#xff0c;还可以提供更好的数据安全性、更方便的文件共享方式。但市面上的产品种类繁多&#xff0c;我们该如何选择合适的产品&#xff0c;通过企业云盘&#xff0…

高效协作处理缓存清理需求:生产者-消费者模式助力多模块缓存管理

在现代应用系统中&#xff0c;缓存是提高性能和减少数据库负载的重要手段之一。然而&#xff0c;缓存的数据在某些情况下可能会过期或者变得无效&#xff0c;因此需要及时进行清理。在复杂的应用系统中&#xff0c;可能有多个系统、多个模块产生缓存清理需求&#xff0c;而这些…

建造者模式——复杂对象的组装与创建

1、简介 1.1、概述 建造者模式又称为生成器模式&#xff0c;它是一种较为复杂、使用频率也相对较低的创建型模式。建造者模式向客户端返回的不是一个简单的产品&#xff0c;而是一个由多个部件组成的复杂产品。 建造者模式是较为复杂的创建型模式&#xff0c;它将客户端与包…

三个常用查询:根据用户名 / token查询用户信息+链表分页条件查询

目录 1.根据用户名或者token查询用户信息 会员信息实体类 统一状态Result类 controller层 service层及实现类 dao层 测试&#xff1a; 2.链表分页条件查询 会员等级实体类 封装条件类PageVo controller层 service层及实现类 dao层 Mapper.xml层 测试 vue前端参考 1.根据用户名…

【MySQL】表的内外连接

目录 一、内连接二、外连接2.1 左外连接2.2 右外连接 三、OJ题 表的连接分为内连和外连 一、内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连接&#xff0c;也是在开发过程中使用的最多的连接查询。 语法&#x…

汉明距离,两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。

题记&#xff1a; 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 示例 1&#xff1a; 输入&#xff1a;x 1, y 4 输出&#xff1a;2 解释&#xff1a; 1 (0 0 0 1) 4 (0 1 0 0…

现在运动耳机什么牌子的好用、最好的运动耳机推荐

对于注重身体健康的小伙伴来说&#xff0c;每周必然都少不了有规律的运动&#xff0c;而运动的时候耳边没有音乐的陪伴总是稍显枯燥无味&#xff0c;很难让人提起干劲来。有些小伙伴觉得运动的时候戴着耳机&#xff0c;稍微跳动几下耳机就开始松动&#xff0c;随时都要分心提防…

QT 作业 day4 7/28

1.思维导图 2.手动完成服务器实现 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器 #include <QTcpSocket> //连接客户端套接字 #include <QMessageBox> #include <QList> //套接字容器 #include &l…

无涯教程-jQuery - show( )方法函数

show()方法仅显示匹配元素中的每个元素(如果隐藏)。此方法还有另一种形式&#xff0c;可以控制动画的速度。 show( ) - 语法 selector.show( ); show( ) - 示例 以下是一个简单的示例&#xff0c;简单说明了此方法的用法- <html><head><title>The jQuer…

php 原型模式

一&#xff0c;原型模式&#xff0c;就是先创建好一个原型对象&#xff0c;然后通过拷贝原型对象来生成新的对象。适用于大对象的创建&#xff0c;因为每次new一个大对象会有很大的开销&#xff0c;原型模式仅需内存拷贝即可。 原型模式中的主要角色&#xff1a; 1&#xff0c;…

Java-数组的定义和使用

一、数组的基本概念 1.1 为什么要使用数组 假设现在要存5个学生的javaSE考试成绩&#xff0c;并对其进行输出&#xff0c;则可有 public static void main(String[] args){ int score1 70; int score2 80; int score3 85; int score4 60; …

List的各种排序

目录 Collections.sort对list进行排序 对象中某个属性进行排序 通过比较器进行比较 JAVA8特性Stream流进行排序 Stream升降序组合使用 Collections.sort对list进行排序 public static void main(String[] args) {List<Integer> list new ArrayList<>();list…