【Python设计模式03】简单工厂模式
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它通过专门定义一个工厂类来负责创建其他类的实例,而不是在客户端代码中直接实例化对象。这样可以将对象创建的过程与使用对象的过程分离,提高代码的可维护性和可扩展性。
简单工厂模式的结构
简单工厂模式包含以下角色:
- 工厂类(Factory):负责创建对象的类。根据不同的条件,实例化并返回不同类型的对象。
- 产品类(Product):由工厂创建的对象,所有创建的对象应实现相同的接口或继承相同的基类。
- 客户端(Client):使用工厂类来获取产品对象,而不直接实例化产品类。
示例
假设我们要创建一个简单的工厂类来生成不同类型的动物对象。首先,我们定义一个Animal基类,然后定义两个具体的产品类Dog和Cat,最后创建一个工厂类AnimalFactory来生成这些对象。
定义产品类
class Animal:def speak(self):passclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"
定义工厂类
class AnimalFactory:@staticmethoddef create_animal(animal_type: str) -> Animal:if animal_type == 'dog':return Dog()elif animal_type == 'cat':return Cat()else:raise ValueError(f"Unknown animal type: {animal_type}")
使用工厂类
def main():factory = AnimalFactory()dog = factory.create_animal('dog')print(dog.speak()) # 输出:Woof!cat = factory.create_animal('cat')print(cat.speak()) # 输出:Meow!try:unknown = factory.create_animal('bird')except ValueError as e:print(e) # 输出:Unknown animal type: birdif __name__ == "__main__":main()
简单工厂模式的优缺点
优点
- 单一职责原则:工厂类负责对象的创建,客户端代码负责使用对象,各自关注自己的职责。
- 提高可维护性:将对象创建的逻辑集中在一个地方,便于修改和维护。
- 提高可扩展性:如果需要添加新的产品,只需修改工厂类而不需要修改客户端代码。
缺点
- 违反开闭原则:每次添加新产品时,都需要修改工厂类,增加了工厂类的复杂性。
- 单一工厂类过于复杂:随着产品种类的增加,工厂类可能变得臃肿,难以维护。
简单工厂模式的适用场景
- 对象创建过程复杂:如果对象的创建过程较为复杂,或者需要根据不同条件创建不同类型的对象,可以使用简单工厂模式。
- 客户端不需要知道具体产品类:客户端只需要使用工厂类来获取对象,不需要了解具体的产品类。
总结
简单工厂模式是一种创建型设计模式,通过定义一个工厂类来创建不同类型的对象,将对象创建的过程与使用对象的过程分离,提高代码的可维护性和可扩展性。尽管简单工厂模式有一些缺点,如违反开闭原则,但在某些场景下仍然非常有用。通过合理使用简单工厂模式,可以有效地简化对象的创建过程,提升代码的质量。
相关文章:
【Python设计模式03】简单工厂模式
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它通过专门定义一个工厂类来负责创建其他类的实例,而不是在客户端代码中直接实例化对象。这样可以将对象创建的过程与使用对象的过程分离,提高代码的可维护…...
java中的Collections类+可变参数
一、概述 Collections类是集合类的工具类,与数组的工具类Arrays类似 二、可变参数(变:数量) 格式:参数类型名...参数,可变参数就是一个数组 注意:可变参数必须放在参数列表的最后并且一个参数列表只能有一个可变参…...
SpringBoot集成腾讯云敏感词校验API流程
1.pom.xml中引入腾讯云jar配置信息 <dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>4.0.11</version> </dependency> 2.application.yaml中添加配置 tencent…...
android 避免混淆类名和方法名,但是方法内容需要被混淆
要避免在使用 ProGuard 或 R8 进行代码混淆时混淆特定类名和方法名的同时让方法内容被混淆,你需要在 ProGuard 配置文件中使用 -keepclassmembers 或 -keep 规则。这些规则允许你指定保留类名和方法名的同时允许方法内部代码被混淆以减小体积和提高安全性。 以下是…...
通过ELRepo修改CentOS 7内核版本的详细步骤
简介: 在Linux系统中,内核版本决定了硬件支持和系统性能。有时,为了获得更好的性能或新特性,我们需要升级或更换内核。本文将详细说明如何在CentOS 7系统上通过ELRepo仓库安装更新的内核版本。 环境准备: CentOS 7系…...
C++开源库glog使用封装--自定义日志输出格式,设置日志保留时间
glog下载和编译 glog开源地址 https://github.com/google/glog glog静态库编译 cd /home/wangz/3rdParty/hldglog/glogmkdir out mkdir build && cd buildcmake .. -DCMAKE_INSTALL_PREFIX../out -DCMAKE_BUILD_TYPERelease -DBUILD_SHARED_LIBSOFF本文选择的glo…...
linux rc.local不生效
1. 权限问题直接 chmod 755 /etc/rc.d/rc.local 即可 2.本次发现问题 环境复杂造成,系统中有多个版本的JDK,导致tomcat无法启动 systemctl status rc-local.service ● rc-local.service - /etc/rc.d/rc.local CompatibilityLoaded: loaded (/usr/lib…...
ROS2入门21讲__第07讲__节点:机器人的工作细胞
目录 前言 通信模型 案例一:Hello World节点(面向过程) 运行效果 代码解析 创建节点流程 案例二:Hello World节点(面向对象) 运行效果 代码解析 创建节点流程 案例三:物体识别节点 …...
k8s node NotReady后会发生什么?
K8s 是一种强大的容器编排和管理平台,能够高效地调度、管理和监控容器化应用程序;其本身使用声明式语义管理着集群内所有资源模型、应用程序、存储、网络等多种资源,Node 本身又属于 K8s 计算资源,上面承载运行着各种类型的应用程…...
uni-starter创建App项目最全流程(日后还有其他功能会不断更新)
一、创建项目 在HbuilderX中点击创建项目,选择uni-starter模板,选择阿里云、Vue3,填写项目名称后点击创建。如果没有下载过uni-starter会自动下载该插件,如下图: 二、 创建云服务器并关联项目 如果是第一次使用&#…...
动态IP和静态IP区别
1.可变性:当设备重新连接时,动态IP将分配新的IP地址,静态IP将保持不变。 2.适用场景:动态IP适用于普通用户或小型办公室,静态IP适用于需要特定IP地址的服务或应用。 3.价格:动态IP通常比静态IP更经济。 4.管理和配置:动…...
蓝牙(2):BR/EDR的连接过程;查询(发现)=》寻呼(连接)=》安全建立=》认证=》pair成功;类比WiFi连接过程。
4.2.1 BR/EDR 流程: 查询(发现)》寻呼(连接)》安全建立》认证》pair成功 4.2.1.1 查询(发现)流程Inquiry (discovering) 类比WiFi的probe request/response 蓝牙设备使用查询流程来发现附近的…...
源码部署EFK
目录 资源列表 基础环境 关闭防护墙 关闭内核安全机制 修改主机名 添加hosts映射 一、部署elasticsearch 修改limit限制 部署elasticsearch 修改配置文件 单节点 集群(3台节点集群为例) 启动 二、部署filebeat 部署filebeat 添加配置文件 启动 三、部署kiban…...
CSDN智能总结助手
github项目地址: https://github.com/anjude/little-demo/tree/master 获取CSDN的user name和user token 打开csdn,打开控制台 - Application - Cookies,找到domain为blog.csdn.net的cookie,复制user_name和user_token的值 把上…...
setImmediate是在当前事件循环的所有周期的末尾执行,还是再当前事件循环的当前周期的下一个周期执行?
实际上,setImmediate 的回调函数会在当前事件循环的当前周期的末尾执行,而不是下一个周期。 在事件循环中,任务分为宏任务(macrotask)和微任务(microtask)。setImmediate 的回调函数属于宏任务…...
建材行业工程设计资质动态核查不通过怎么办
详细了解核查结果:首先,需要仔细阅读核查结果,了解不通过的具体原因。这些原因可能涉及企业基本情况、技术负责人情况、主要人员情况、设备和厂房情况、业绩和信誉等方面。 针对问题制定整改计划:根据核查结果,针对存…...
二叉数之插入操作
首先是题目 给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。 注意,可能存在多种有效…...
【Python】全局变量与init的区别
一个脚本里,设置全局变量,和初始化类时__init__中加载,有什么区别? 在Python脚本中,使用全局变量和在类的__init__方法中加载数据有几个关键区别: 作用域: 全局变量:全局变量在整个…...
JAVA学习-练习试用Java实现“位1的个数”
问题: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 1 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如…...
HTML静态网页成品作业(HTML+CSS)——魅族商城首页网页(1个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…...
LLMKG+ 知识图谱改进实战指南(非常详细),大模型提升质量与覆盖从入门到精通,收藏这一篇就够了!
LLMKG+: Systematically improving knowledge quality and coverage in KGs using LLMs – A case study in medical domain 摘要 本文提出了LLMKG框架,首次系统性地解决了知识图谱中三元组级别的语义冗余问题。该框架结合检索增强生成与分层扩展过滤机…...
思科ASA防火墙“升级困境“破解“——飞将让50人团队平滑过渡远程办公
一、客户需求介绍 一家50人规模的企业服务公司,此前使用思科ASA 5506防火墙承载本地上网和远程办公需求,但因以下需求陷入瓶颈: 思科ASA 5506性能不足,设备自带的AnyConnect许可证不够用;保留移动办公员工习惯&…...
三线制SPI通信原理与ZYNQ实现方案
1. 三线制SPI通信的背景与应用场景 在嵌入式系统设计中,SPI(Serial Peripheral Interface)总线是最常用的通信接口之一。传统四线制SPI包含SCLK(时钟)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)和SS(片选)四条信号线。但在某些特定应用场景下,为…...
51单片机(一) --- 入门
一、核心基础概念铺垫 在接触 51 单片机实操前,先理清 CPU、处理器架构、位运算等基础概念,这是理解单片机工作原理的核心前提。 1.1 CPU 与处理器主频 CPU(Central Processing Unit) 即中央处理器,是所有计算设备的…...
拆解Clonezilla镜像:除了partclone,你还需要知道的底层原理与工具链
拆解Clonezilla镜像:从分卷压缩到文件系统的技术全景解析 当我们需要从Clonezilla备份中提取单个文件时,传统方法往往要求完整恢复整个镜像——这种"全有或全无"的方式在存储资源有限的情况下显得尤为笨重。本文将带您深入Clonezilla镜像的底层…...
计算机毕业设计:Python二手车市场数据分析及价格预测平台 Django框架 可视化 线性回归 数据分析 机器学习 深度学习 AI 大模型(建议收藏)✅
博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...
Linux进程信号详解(二):信号产生
当前阶段:一、通过终端按键产生信号1.1 基本操作CtrlC → SIGINTCtrl\ → SIGQUIT 可以发送终止信号Ctrl Z -> SIGSTP 可以发送停止信号,将当前前台进程挂起到后台设置所有信号都可以自定义捕捉 : 1.2 理解OS如何得知键盘有数据1.3 初步理…...
IEEE旗下通信类期刊全解析:从影响因子看学术风向标(2023最新版)
IEEE通信类期刊2023全景透视:影响因子背后的学术趋势与选刊策略 翻开最新发布的《期刊引证报告》(JCR2023),IEEE旗下通信类期刊的影响因子变化再次成为学界热议焦点。作为全球最大的专业技术组织之一,IEEE出版的期刊向…...
从源码到实践:拆解PX4飞控如何处理Mavros的GPS/ENU坐标指令(附精准转换代码)
从源码到实践:拆解PX4飞控如何处理Mavros的GPS/ENU坐标指令(附精准转换代码) 当你在户外操控四旋翼无人机时,是否曾疑惑过GPS坐标如何精确转换为飞控能理解的ENU坐标系?PX4飞控内部究竟如何处理这些位置指令࿱…...
突破设备限制:解锁Sunshine自托管游戏串流的全场景应用指南
突破设备限制:解锁Sunshine自托管游戏串流的全场景应用指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 价值定位:为什么Sunshine能重新定义游戏串流体验…...
