Python实现抽象工厂模式

news2024/11/25 1:06:41

抽象工厂模式是一种创建型设计模式,用于创建一系列相关或依赖对象的家族,而无需指定具体类。在Python中,可以通过类和接口的组合来实现抽象工厂模式。

下面是一个简单的Python实现抽象工厂模式的示例:

# 抽象产品接口
class AbstractProductA:
    def do_something(self):
        pass

class AbstractProductB:
    def do_something_else(self):
        pass

# 具体产品类
class ConcreteProductA1(AbstractProductA):
    def do_something(self):
        print("Product A1 doing something.")

class ConcreteProductA2(AbstractProductA):
    def do_something(self):
        print("Product A2 doing something.")

class ConcreteProductB1(AbstractProductB):
    def do_something_else(self):
        print("Product B1 doing something else.")

class ConcreteProductB2(AbstractProductB):
    def do_something_else(self):
        print("Product B2 doing something else.")

# 抽象工厂接口
class AbstractFactory:
    def create_product_a(self) -> AbstractProductA:
        pass

    def create_product_b(self) -> AbstractProductB:
        pass

# 具体工厂类
class ConcreteFactory1(AbstractFactory):
    def create_product_a(self) -> AbstractProductA:
        return ConcreteProductA1()

    def create_product_b(self) -> AbstractProductB:
        return ConcreteProductB1()

class ConcreteFactory2(AbstractFactory):
    def create_product_a(self) -> AbstractProductA:
        return ConcreteProductA2()

    def create_product_b(self) -> AbstractProductB:
        return ConcreteProductB2()

# 客户端代码
def client_code(factory: AbstractFactory):
    product_a = factory.create_product_a()
    product_b = factory.create_product_b()

    product_a.do_something()
    product_b.do_something_else()

# 使用具体工厂1
factory1 = ConcreteFactory1()
client_code(factory1)

# 使用具体工厂2
factory2 = ConcreteFactory2()
client_code(factory2)

在上面的示例中,我们定义了抽象产品接口 AbstractProductA 和 AbstractProductB,然后实现了具体的产品类 ConcreteProductA1、ConcreteProductA2、ConcreteProductB1 和 ConcreteProductB2。

接着,我们定义了抽象工厂接口 AbstractFactory,并实现了具体的工厂类 ConcreteFactory1 和 ConcreteFactory2,每个具体工厂类都负责创建一组相关产品的实例。

最后,在客户端代码中,我们可以通过传入不同的具体工厂对象,来创建不同家族的产品,并调用相应的方法。

这就是一个简单的Python实现抽象工厂模式的例子。通过抽象工厂模式,我们可以实现一组相关产品的创建,同时与具体产品的类名解耦,提高代码的灵活性和可维护性。

在这里插入图片描述

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

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

相关文章

客户案例 | 思腾合力服务器助力西安电子科技大学人工智能实验室建设

客户介绍 西安电子科技大学是以信息与电子学科为主,工、理、管、文多学科协调发展的全国重点大学,直属教育部,是国家“优势学科创新平台”项目和“211工程”项目重点建设高校之一、国家双创示范基地之一、首批35所示范性软件学院、首批9所示范…

微服务系列(1)-who i am?

微服务系列(1)-我是谁 应用架构的演化 简单来说系统架构可以分为以下几个阶段:复杂的臃肿的单体架构-SOA架构-微服务 单体架构及其所面临的问题 在互联网发展初期,用户数量少,流量小,硬件成本高。因此…

LangChain Agents深入剖析及源码解密上(一)

LangChain Agents深入剖析及源码解密上(一) LangChain Agents深入剖析及源码解密上 Agent工作原理详解 本节会结合AutoGPT的案例,讲解LangChain代理(Agent)为核心的内容。我们前面已经谈了代理本身的很多内容,也看了绝大部分的源代码,例如:ReAct的源代码,还有mrkl的源代…

HDFS基本操作命令

这里写目录标题 HDFS Shell CLI客户端说明常用命令hadoop fs -mkdir [-p] <path>hadoop fs -ls [-h] [-R] [<path>...]上传文件到指定目录下方法一:hadoop fs -put [-f] [-p] <localsrc>.....<dst>方法二&#xff1a;hadoop fs -moveFromLocal <loc…

金融机构如何管理UPS设备?这个方法超值!

UPS监控在金融行业中扮演着至关重要的角色&#xff0c;确保金融机构在电力故障或波动的情况下依然能够保持业务的稳定运行。 因此&#xff0c;UPS监控在金融行业中扮演着守护者的角色&#xff0c;确保金融机构能够在复杂的电力环境中持续稳健地运行。 客户案例 一家国际性的金…

数据库应用:Redis安装部署

目录 一、理论 1.缓存 2.关系型数据库与非关系型数据库 3.Redis 4.Redis安装部署 5.Redis命令工具 6.Redis数据库常用命令 7.Redis多数据库操作 二、实验 1.Redis安装部署 2.Redis命令工具 3.Redis数据库命令 4.Redis多数据库操作 三、问题 1.RESP连接CentOS 7 R…

KnowStreaming系列教程第二篇——项目整体架构分析

一、KS项目代码结构&#xff1a; ks项目代码结构如上&#xff1a; (1)km-console 是前端部分&#xff0c;基于React开发 (2)km-rest 是后端部分&#xff0c;主要是接受前端请求&#xff0c;对应controller相关代码所在模块 (3)km-biz:业务逻辑处理 (4)km-core:核心逻辑 (5…

MapGIS“透明”地下空间,助力城市纵向发展新实践

城市地下空间拓展是城市化发展的必然趋势&#xff0c;城市化发展需要拓展城市空间&#xff0c;城市空间的横向拓展以蔓延式、平面化的发展模式造成土地资源的巨大浪费&#xff0c;地下空间是城市战略性新型国土资源&#xff0c;开发利用城市地下空间是提高土地利用效率、扩大城…

P2096 最佳旅游线路

竖直方向可以随便走嘛&#xff0c;所以求出每一列 的最大值&#xff0c;再做比较就可以了(求最大子段和)。 ACcode: #include<bits/stdc.h> using namespace std; int n,m,a[105][20010],b[20010],dp[20010]; void solve() {cin>>n>>m;for(int i1;i<n;i)f…

linux服务器部署

文章目录 一、基本工具安装1.使用vi命令编辑文件 二、安装1.jdk2.读入数据 总结 一、基本工具安装 1.使用vi命令编辑文件 注:如果vi命令没有&#xff0c;可以使用yum -y install vim或者apt-get install vim命令安装。 Linux操作系统第二讲 二、安装 1.jdk 参考 卸载jdk…

Spring MVC 是什么?

一、什么是 Spring MVC&#xff1f; 官方对于 Spring MVC 的描述是这样的&#xff1a; Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web …

Robust Unsupervised StyleGAN Image Restoration总结整理

鲁棒的无监督StyleGAN图像恢复 一.创新点 现有的无监督方法必须针对每个任务和降级级别进行仔细调整。&#xff08;这里每个任务都是什么&#xff1f;降级级别是什么&#xff1f;&#xff09; 在这里使用StyleGAN图像恢复健壮&#xff0c;即单组超参数在宽范围的退化水平上起…

[Angular] 主从表结构,从表记录在主表固定栏位上呈现

Background 主从表结构&#xff0c;有时为了方便数据呈现&#xff0c;在UI上不显示从表资料&#xff0c;那么需要动态把从表的资料加载到主表的固定栏位上。 例如&#xff1a;主表是人员信息&#xff0c;从表是银行卡信息&#xff0c;一个人在同一家银行可能有多张银行卡&…

Kubernetes.Service—使用源 IP

使用源 IP 运行在 Kubernetes 集群中的应用程序通过 Service 抽象发现彼此并相互通信&#xff0c;它们也用 Service 与外部世界通信。 本文解释了发送到不同类型 Service 的数据包的源 IP 会发生什么情况&#xff0c;以及如何根据需要切换此行为。 准备开始 术语表 本文使用…

大模型开发(十二):Function calling 流程优化并实现多轮对话任务

全文共1w余字&#xff0c;预计阅读时间约25~40分钟 | 满满干货(附代码案例)&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;围绕Chat模型的Function calling功能进行更高层次的函数封装&#xff0c;并实现一个能够调用外部函数的多轮对话任务 写在前面&#xff1a;本文…

Vue系列第四篇:Vue2 + Element开发登录页面

Vue开发中Element是一个比较受欢迎的界面库&#xff0c;实际开发中Vue2搭配Element UI开发&#xff0c;Vue3搭配Element plus开发&#xff0c;今天就用Vue2 Element来开发登录页面。 目录 1.Element UI介绍 1.1官网 1.2element-ui安装 2.开发环境准备 2.1core-js安装 2…

20230724将真我Realme手机GT NEO3连接到WIN10的电脑的步骤

20230724将真我Realme手机GT NEO3连接到WIN10的电脑的步骤 2023/7/24 23:23 缘起&#xff1a;因为找使用IMX766的手机&#xff0c;找到Realme手机GT NEO3了。 同样使用IMX766的还有&#xff1a;Redmi Note12Pro 5G IMX766 旗舰影像 OIS光学防抖 OLED柔性直屏 8GB256GB时光蓝 现…

C语言 strlen()函数

一、strlen&#xff08;&#xff09;函数的简介 strlen函数&#xff1a;计算的是字符串str的长度&#xff0c;从字符的首地址开始遍历&#xff0c;以 \0 为结束标志&#xff0c;然后将计算的长度返回&#xff0c;计算的长度并不包含\0。下面是库中的strlen&#xff08;&#xf…

Dubbo Triple 协议重磅升级:支持通过 HTTP 连通 Web 与后端微服务

作者&#xff1a;刘军 全新升级的 Triple 协议 在微服务协议选型方面我们看到越来越多的应用从 Dubbo2 TCP 二进制协议迁移到 Dubbo3 Triple 协议 (兼容 gRPC)&#xff0c;以充分利用 Triple 的高效、全双工、Streaming 流式通信模型等能力&#xff1b;TripleHTTP/2 的组合很…

内存函数讲解

&#x1f495;"痛苦难以避免&#xff0c;而磨难可以选择。"-->村上春树&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;数据在内存中的存储 内存函数就是管理内存数据的函数&#xff0c;包含于头文件<string.h>中 1.memcpy函数-->内存…