当前位置: 首页 > news >正文

抽象工厂模式(Abstract factory pattern)- python实现

抽象工厂模式的通俗示例

想象一下,你正在经营一家家具店,你需要从不同的供应商那里采购不同的家具系列。有的供应商提供的是现代风格家具,包括现代沙发、现代椅子和现代桌子;而有的供应商提供的是古典风格家具,包括古典沙发、古典椅子和古典桌子。你不想每次都具体指定要采购哪个供应商的哪个具体产品,你只需要告诉你的采购团队你要的是现代风格家具系列或古典风格家具系列。这里的“现代风格家具系列”和“古典风格家具系列”就可以看作是抽象工厂模式中的“对象家族”。

抽象工厂模式的通俗解释

抽象工厂模式是一种设计模式,它提供了一个抽象的接口,让你可以创建一系列相关或相互依赖的对象,而不需要知道这些对象的具体类。在这个模式中,你只需要知道你想要的对象家族(比如现代或古典家具),而具体的对象创建工作则由具体的工厂来完成。

抽象工厂模式的具体说明

  • 抽象工厂(Abstract Factory):这是一个接口,声明了一组用于创建不同抽象产品的方法。在上述例子中,这个接口可以声明创建沙发、椅子和桌子的方法。

  • 具体工厂(Concrete Factory):实现了抽象工厂接口的类,负责创建具体的产品。比如,一个具体工厂可以是“现代家具工厂”,它负责创建现代沙发、现代椅子等;另一个具体工厂可以是“古典家具工厂”,它负责创建古典沙发、古典椅子等。

  • 抽象产品(Abstract Product):这些是一组相关产品的抽象类或接口,每类产品都可能有很多不同的具体实现。在例子中,沙发、椅子和桌子就是抽象产品。

  • 具体产品(Concrete Product):实现了抽象产品接口的具体类。比如,现代沙发、现代椅子是具体产品。

抽象工厂模式的优点是:

  • 分离接口与实现:客户端只需知道它们需要什么样的产品家族,而不必知道具体产品的类。

  • 提高可扩展性:新增产品族时,不需要修改已有系统,只需添加一个新的具体工厂即可。

  • 一致的对象创建:确保创建的对象属于同一风格或主题。

但抽象工厂模式也有缺点:

  • 复杂性增加:理解和实现抽象工厂模式需要更多的时间和精力。

  • 扩展困难:如果需要添加新的产品,可能需要修改抽象工厂和所有具体工厂。

在实际应用中,抽象工厂模式特别适合于那些有多种产品族,且产品族中的产品需要一起使用的情况。

python实践

import abc# 两种小汽车
class Mercedes_C63(object):"""梅赛德斯 C63"""def __repr__(self):return "Mercedes-Benz: C63"class BMW_M3(object):"""宝马 M3"""def __repr__(self):return "BMW: M3"# 两种SUV
class Mercedes_G63(object):"""梅赛德斯 G63"""def __repr__(self):return "Mercedes-Benz: G63"class BMW_X5(object):"""宝马 X5"""def __repr__(self):return "BMW: X5"class AbstractFactory(object):"""抽象工厂类该类是一个抽象类,定义了生产不同类型车辆产品的接口除了能生产小汽车外,还可以生产SUV使用该模式可以将创建不同类型对象的逻辑进行封装,便于扩展和替换具体实现"""# 标记该类为抽象类__metaclass__ = abc.ABCMeta# 定义生产小汽车产品的抽象方法# 该方法没有具体实现,需要由具体的子类根据实际需求实现@abc.abstractmethoddef product_car(self):pass# 定义生产SUV产品的抽象方法# 同样,该方法的具体实现由具体的子类完成@abc.abstractmethoddef product_suv(self):passclass MercedesFactory(AbstractFactory):"""梅赛德斯工厂"""def product_car(self):return Mercedes_C63()def product_suv(self):return Mercedes_G63()class BMWFactory(AbstractFactory):"""宝马工厂"""def product_car(self):return BMW_M3()def product_suv(self):return BMW_X5()if __name__ == '__main__':c1 = MercedesFactory().product_car()s1 = MercedesFactory().product_suv()print(c1, s1)s2 = BMWFactory().product_suv()c2 = BMWFactory().product_car()print(c2, s2)

相关文章:

抽象工厂模式(Abstract factory pattern)- python实现

抽象工厂模式的通俗示例 想象一下,你正在经营一家家具店,你需要从不同的供应商那里采购不同的家具系列。有的供应商提供的是现代风格家具,包括现代沙发、现代椅子和现代桌子;而有的供应商提供的是古典风格家具,包括古…...

adb Connection reset by peer的解决方法

本文同步发于:https://www.cnblogs.com/yeshen-org/p/18350232 最近在编译一个老项目,项目中依赖了很多第三方库,用gradle编译要20-30分钟,而且内存开销很大。 公司配的15G内存的电脑,一次编译能用到14G。 编译的时候&…...

111111111

1111111111111111111...

搜维尔科技:Varjo XR-4使用UE5 打造最具沉浸感的混合现实环境

Varjo XR-4使用UE5打造最具沉浸感的混合现实环境 搜维尔科技:Varjo XR-4使用UE5 打造最具沉浸感的混合现实环境...

从分散到集中:TSINGSEE青犀EasyCVR视频汇聚网关在视频整体监控解决方案中的整合作用

边缘计算视频汇聚网关是基于开放式、大融合、全兼容、标准化的设计架构理念,依据《安全防范视频监控联网系统信息传输、交换、控制技术要求》(GB/T28181-2011)标准开发,集流媒体转发、视频编码、视频管理、标准通信协议、网络穿透…...

React学习-jsx语法

jsx语法,浏览器不认识,需要经过babel编译 https://babeljs.io/ 面试题:jsx的作用? 普通回答:可以在js中返回dom,经过babel编译成js认识的代码import { jsx as _jsx, jsxs as _jsxs } from "react/j…...

uniapp多图上传uni.chooseImage上传照片uni.uploadFile

uniapp多图上传uni.chooseImage上传照片uni.uploadFile 代码示例: /**上传照片 多图*/getImage() {uni.chooseImage({count: 9, //默认9sizeType: [original, compressed], //可以指定是原图还是压缩图,默认二者都有sourceType: [album], //从相册选择/…...

鸿蒙(API 12 Beta2版)媒体开发【处理音频焦点事件】

音频打断策略 多音频并发,即多个音频流同时播放。此场景下,如果系统不加管控,会造成多个音频流混音播放,容易让用户感到嘈杂,造成不好的用户体验。为了解决这个问题,系统预设了音频打断策略,对…...

c语言第12天

指针的引入 为函数修改实参提供支持。 为动态内存管理提供支持。 为动态数据结构提供支持。 为内存访问提供另一种途径。 指针概述 内存地址:系统为了内存管理的方便,将内存划分为一个个的内存单元(1个内存单元占1个字 节)&…...

回归预测|一种多输入多输出的粒子群优化支持向量机数据回归预测Matlab程序PSO-MSVR非for循环实现 原理上进行修改多输出

回归预测|一种多输入多输出的粒子群优化支持向量机数据回归预测Matlab程序PSO-MSVR非for循环实现 原理上进行修改多输出 文章目录 前言回归预测|一种多输入多输出的粒子群优化支持向量机数据回归预测Matlab程序PSO-MSVR非for循环实现 原理上进行修改多输出 一、PSO-MSVR模型1. …...

《花100块做个摸鱼小网站! 》第二篇—后端应用搭建和完成第一个爬虫

一、前言 大家好呀,我是summo,前面已经教会大家怎么去阿里云买服务器(链接在这,需要自取:https://developer.aliyun.com/huodong/dashiblogger?userCodemtbtcjr1),以及怎么搭建JDK、Redis、My…...

Mapreduce_csv_averageCSV文件计算平均值

csv文件求某个平均数据 查询每个部门的平均工资,最后输出 数据处理过程 employee_noheader.csv(没做关于首行的处理,运行时请自行删除) EmployeeID,EmployeeName,DepartmentID,Salary 1,ZhangSan,101,5000 2,LiSi,102,6000…...

将UEC++项目转码成UTF-8

方法一 如果文件不多的话,可以手动一个一个进行修改。添加 “高级保存选项” 手动改为UTF-8 方法二 使用editorconfig文件,统一编码问题。通过:“工具” > “选项”>"文本编辑器" > "C/C" > "代码样式…...

深入探索MySQL C API:使用C语言操作MySQL数据库

目录 引言 一. MySQL C API简介 二. MySQL C API核心函数 2.1 初始化和连接 2.2 配置和执行 2.3 处理结果 2.4 清理和关闭 2.5 错误处理 三. MySQL使用过程 四. 实现CRUD操作 4.1 创建数据库并建立表 ​编辑 4.2 添加数据(Create) ​编辑 …...

武汉流星汇聚:亚马逊助力跨境电商扬帆起航,海外影响力显著提升

在全球化浪潮的推动下,跨境电商已成为连接世界市场的重要桥梁。而在这场跨越国界的商业盛宴中,亚马逊作为全球电商的领军者,以其独特的商业模式、庞大的用户基础,为无数企业提供了前所未有的发展机遇。武汉流星汇聚电子商务有限公…...

C语言:设计模式

C语言和设计模式(总结篇) 书籍:《大话设计模式》 2、C语言和设计模式:原型模式(复制自己,生成另外一个实例对象) 17、C语言实现面向对象编程 : 封装、继承、多态 ---- C语言可:封…...

Pandas数据选择的艺术:深入理解loc和iloc

在数据科学领域,Pandas是处理和分析数据的瑞士军刀。掌握Pandas中的数据选择技巧,尤其是loc和iloc的使用,对于提高数据处理效率至关重要。本文将深入探讨loc和iloc的用法,通过丰富的示例,帮助你精确地选取所需的数据&a…...

<数据集>固定视角监控牧场绵羊识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:3615张 标注数量(xml文件个数):3615 标注数量(txt文件个数):3615 标注类别数:1 标注类别名称:[Sheep] 序号类别名称图片数框数1Sheep361529632 使用标注工具&#…...

浙大数据结构慕课课后题(06-图2 Saving James Bond - Easy Version)(拯救007)

题目要求: This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the worlds most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake fi…...

前置(1):npn 和yarn ,pnpm安装依赖都是从那个源安装的啊,有啥优缺点呢

在使用 npm、yarn 或 pnpm 进行依赖管理和安装时,它们通常默认从 npm 的公共仓库(https://registry.npmjs.org/)获取包。不过,用户可以配置它们以从其他源获取,例如企业内部的私有仓库或镜像站点(如淘宝的 …...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Java 加密常用的各种算法及其选择

在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...