Python设计模式详解之2 —— 工厂模式
工厂模式(Factory Pattern)是一种创建型设计模式,旨在定义一个用于创建对象的接口,但由子类决定实例化哪个类。工厂模式可以帮助我们将对象的创建与其使用分离,增强代码的可扩展性和维护性。
工厂模式的分类
- 简单工厂模式(Simple Factory Pattern)
- 工厂方法模式(Factory Method Pattern)
- 抽象工厂模式(Abstract Factory Pattern)
这里先介绍 简单工厂模式和工厂方法模式
1. 简单工厂模式
简单工厂模式是一种创建型设计模式,它通过一个单一的工厂类来创建不同类型的对象。这个工厂类通常具有一个静态方法,根据输入的参数决定创建哪种对象。
结构:
- 工厂类:包含用于创建对象的静态方法。
- 产品接口或抽象类:定义了创建对象的基本接口。
- 具体产品类:实现产品接口。
实现方式:
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):if animal_type == 'dog':return Dog()elif animal_type == 'cat':return Cat()else:raise ValueError("Unknown animal type")# 使用示例
animal = AnimalFactory.create_animal('dog')
print(animal.speak()) # 输出 "Woof!"
优点:
- 简单易用:只需调用工厂方法即可创建对象,无需关心具体的实现。
- 集中管理对象创建:所有对象的创建逻辑都集中在一个地方,方便修改。
缺点:
- 不符合开闭原则:如果需要增加新类型,需要修改工厂类的代码,可能会引入错误。
- 职责过重:工厂类随着产品类型的增加变得复杂,难以维护。
适用场景:
- 需要创建少量的类,且不频繁更改。
- 客户端需要与具体类解耦。
2. 工厂方法模式
工厂方法模式是简单工厂模式的进一步抽象。它定义了一个创建对象的接口,但由子类决定实例化的类是哪一个。每个具体子类都有自己的工厂方法来创建对象。
结构:
- 抽象产品:定义了产品的接口。
- 具体产品:实现产品接口的具体类。
- 抽象工厂:声明了一个返回产品对象的工厂方法。
- 具体工厂:实现了工厂方法,返回具体产品实例。
实现方式:
from abc import ABC, abstractmethod# 抽象产品类
class Animal(ABC):@abstractmethoddef speak(self):pass# 具体产品类
class Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"# 抽象工厂类
class AnimalFactory(ABC):@abstractmethoddef create_animal(self):pass# 具体工厂类
class DogFactory(AnimalFactory):def create_animal(self):return Dog()class CatFactory(AnimalFactory):def create_animal(self):return Cat()# 使用示例
dog_factory = DogFactory()
dog = dog_factory.create_animal()
print(dog.speak()) # 输出 "Woof!"cat_factory = CatFactory()
cat = cat_factory.create_animal()
print(cat.speak()) # 输出 "Meow!"
优点:
- 符合开闭原则:可以通过添加新的具体工厂类来扩展代码,而无需修改现有工厂类。
- 更灵活:每个具体工厂类负责创建特定类型的产品,使得扩展更加容易。
缺点:
- 类的数量增加:每增加一个产品类型都需要创建新的具体工厂类。
- 增加了复杂性:比简单工厂模式更复杂,需要更多的类和接口。
适用场景:
- 需要将对象的创建与使用解耦,同时需要经常扩展产品类。
- 当系统中存在多种产品类型,并且需要根据不同的条件来创建不同的产品实例时。
区别总结:
- 简单工厂模式使用一个工厂类来创建对象,容易实现,但不符合开闭原则,修改时需要调整已有的工厂代码。
- 工厂方法模式使用多个具体工厂类,每个工厂类负责创建一个产品,符合开闭原则,便于扩展,但实现较为复杂。
何时选择哪种模式:
- 如果对象创建逻辑简单且变更不频繁,可以使用简单工厂模式。
- 如果对象创建逻辑复杂且需要频繁扩展和修改,应使用工厂方法模式,以增加灵活性和扩展性。
相关文章:
Python设计模式详解之2 —— 工厂模式
工厂模式(Factory Pattern)是一种创建型设计模式,旨在定义一个用于创建对象的接口,但由子类决定实例化哪个类。工厂模式可以帮助我们将对象的创建与其使用分离,增强代码的可扩展性和维护性。 工厂模式的分类 简单工厂…...
【Zookeeper】二、主从应用(master-worker架构)
以一张具有代表性的架构风格展开本篇论述 一般在这种架构中,主节点所负责的工作主要有 跟踪从节点状态分配任务到从节点,并跟踪任务的有效性(任务是否正常执行完成) 此时,我们需要关注三个问题 主节点崩溃 如果主节…...
Diffusion【2】:VAE
系列文章目录 文章目录 系列文章目录前言1. Abstract2. Introduction2.1. Motivation2.2. Contribution 3. Methods3.1. Problem Scenario3.2. The variational bound3.3. The SGVB estimator and AEVB algorithm3.3.1. Stochastic Gradient Variational Bayes Estimator3.3.2.…...
高级java每日一道面试题-2024年11月19日-基本篇-获取一个类Class对象的方式有哪些?
如果有遗漏,评论区告诉我进行补充 面试官: 获取一个类Class对象的方式有哪些? 我回答: 在 Java 中,获取一个类的 Class 对象有多种方式。这些方式各有优缺点,适用于不同的场景。以下是常见的几种方法及其详细解释: 1. 使用 new 关键字实…...
xilinx xapp1171学习笔记
在xapp1171示例中,假设Host PC将PCIE:BAR0赋值为:0x00000000_def00000 PCIEBAR2AXIBAR_00x81000000,即Host PC读写0x00000000_def00000就是在读写AXI地址0x81000000(BRAM在AXI总线上的基地址) 在AXI总线上࿰…...
一次需升级系统的wxpython安装(macOS M1)
WARNING: The scripts libdoc, rebot and robot are installed in /Users/用户名/Library/Python/3.8/bin which is not on PATH. 背景:想在macos安装Robot Framework ,显示pip3不是最新,更新pip3后显示不在PATH上 参看博主文章末尾 MAC系统…...
el-table 数据去重后合并表尾合计行,金额千分位分割并保留两位小数,表尾合计行表格合并
问题背景 最近在做后台管理项目el-table 时候需要进行表尾合计,修改合计后文字的样式,合并单元格。 想实现的效果 合并表尾单元格前三列为1格;对某些指定的单元格进行表尾合计;合计后的文本样式加粗;涉及到金额需要千…...
Springboot整合mybatis-plus使用pageHelper进行分页
PageHelper 使用步骤全解析 在进行 Web 应用开发时,经常会涉及到数据库数据的分页展示。PageHelper 是一个非常实用的 MyBatis 分页插件,它能够方便地实现数据库查询结果的分页功能,极大地提高了开发效率。以下将简单介绍 PageHelper 的使用…...
【Xbim+C#】创建拉伸的墙
基础 基础回顾 效果图 简单的工具类 using System.Collections.Generic; using System.Linq; using Xbim.Common.Step21; using Xbim.Ifc; using Xbim.Ifc4.GeometricConstraintResource; using Xbim.Ifc4.GeometricModelResource; using Xbim.Ifc4.GeometryResource; using…...
【阅读记录-章节3】Build a Large Language Model (From Scratch)
目录 3 Coding attention mechanisms3.1 The problem with modeling long sequences背景:注意力机制的动机 3.2 Capturing data dependencies with attention mechanismsRNN的局限性与改进Transformer架构的革命 3.3 Attending to different parts of the input wit…...
three.js 对 模型使用 视频进行贴图修改材质
three.js 对 模型使用 视频进行贴图修改材质 https://threehub.cn/#/codeMirror?navigationThreeJS&classifyapplication&idvideoModel import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { GLTFLoad…...
MySQL - 数据库基础 | 数据库操作 | 表操作
文章目录 1、数据库基础1.1为什么要有数据库1.2主流的数据库1.3连接MySQL1.4服务器、数据库、表的关系1.5 MySQL框架1.6 SQL分类1.7储存引擎 2.数据库操作2.1创建数据库2.2字符集和校验规则2.3删除数据库2.4修改数据库2.5备份与恢复2.6查看连接情况 3.表的操作3.1创建表3.2查看…...
maven父子项目
目录 一、创建Maven父子项目 二、父子项目的关联 三、父子项目的继承关系 四、构建父子项目 五、Maven父子项目的优势 Maven父子项目是一种项目结构,它允许一个父项目(也称为根项目)管理多个子项目(也称为模块)。…...
NLP论文速读(多伦多大学)|利用人类偏好校准来调整机器翻译的元指标
论文速读|MetaMetrics-MT: Tuning Meta-Metrics for Machine Translation via Human Preference Calibration 论文信息: 简介: 本文的背景是机器翻译(MT)任务的评估。在机器翻译领域,由于不同场景和语言对的需求差异&a…...
MyBatis——#{} 和 ${} 的区别和动态 SQL
1. #{} 和 ${} 的区别 为了方便,接下来使用注解方式来演示: #{} 的 SQL 语句中的参数是用过 ? 来起到类似于占位符的作用,而 ${} 是直接进行参数替换,这种直接替换的即时 SQL 就可能会出现一个问题 当传入一个字符串时ÿ…...
解决sql字符串
根据你描述的情况以及调试截图中的内容,我可以确认你的 sql 字符串在 Python 中由于转义字符的问题,可能导致在 Oracle 中运行时出错。 以下是一些排查和修改建议: 问题分析 转义字符问题: 在调试界面中可以看到,DEC…...
深度解析:Android APP集成与拉起微信小程序开发全攻略
目录 一、背景以及功能介绍 二、Android开发示例 2.1 下载 SDK 2.2 调用接口 2.3 获取小程序原始Id 2.4 报错提示:bad_param 2.4.1 错误日志 2.4.2 解决方案 相关推荐 一、背景以及功能介绍 需求:产品经理需要APP跳转到公司的小程序(最好指定页…...
Leetcode 被围绕的区域
算法思想(解题思路): 这道题的核心是 将所有被边界包围的 O 保留下来,而将其他被围绕的 O 转换为 X。为了实现这一目标,我们可以分三步完成: 第一步:标记边界及其相连的 O 为特殊标记ÿ…...
ssm框架-spring-spring声明式事务
声明式事务概念 声明式事务是指使用注解或 XML 配置的方式来控制事务的提交和回滚。 开发者只需要添加配置即可, 具体事务的实现由第三方框架实现,避免我们直接进行事务操作! 使用声明式事务可以将事务的控制和业务逻辑分离开来,提…...
React第五节 组件三大属性之 props 用法详解
特性 a、props最好是仅限于父子上下级之间的数据传递,如果是祖孙多级之间传递属性,可以考虑使用props是否合适,或者使用替代方案 useContext() 或者使用 redux状态管理; b、props 中的属性是只读属性,如果想修改其中的…...
ZStack控制台报错Failed to connect to console排查指南
1. 问题现场还原:不是连接失败,而是控制台页面直接报错弹窗Zstack 打开控制台报错——这六个字背后藏着一个在私有云运维一线高频出现、却常被误判为“网络不通”或“浏览器问题”的典型故障。我第一次遇到它是在给某制造企业做ZStack 4.5.2升级后的验收…...
iOS自动化测试真机连接失败的五大根因与工程化解决方案
1. 为什么iOS自动化测试总卡在“连不上真机”这一步? Appium做iOS自动化,标题里写“全网最详细”,不是吹牛,是踩过太多坑之后的实话。我带过三支测试团队,从2018年用Xcode 9配Appium 1.8开始,到今天Xcode 1…...
LVGL样式进阶:别再只改颜色了!手把手教你定制lv_switch的动画和lv_btn的按压反馈
LVGL样式进阶:别再只改颜色了!手把手教你定制lv_switch的动画和lv_btn的按压反馈 在嵌入式UI开发中,LVGL作为轻量级图形库的代表,其样式系统的灵活性常常被低估。大多数开发者停留在修改背景色、字体颜色等基础操作,却…...
2026 年好用的事业编面试软件盘点:AI 驱动的结构化备考解决方案
文章摘要 随着 2026 年全国事业单位招聘考试进入高峰期,越来越多的考生开始借助专业软件进行面试备考。本文从技术架构、功能完整性、用户体验和备考效果四个维度,对当前市场上主流的事业编面试软件进行全面测评。经过多轮实际测试和用户反馈分析&#…...
微信QQ语音解码终极指南:silk-v3-decoder免费解锁音频文件
微信QQ语音解码终极指南:silk-v3-decoder免费解锁音频文件 【免费下载链接】silk-v3-decoder [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Batch conversion support. …...
ISTA 3H-2011 全解析|机械搬运散装运输容器综合模拟测试标准(CSDN 完整版)
前言ISTA 3H-2011 是 ISTA 3 系列高级综合模拟性能测试,专门针对机械搬运的散装运输容器,容器可装载同种或不同产品,多用于汽车配件周转箱、工业散装料架、可循环运输容器等场景。标准完整模拟散装容器在物流中的水平冲击、旋转面 / 棱跌落、…...
深入理解 Java 反射机制(Reflection)
一句话先给答案反射 在程序运行时,动态获取类的信息并动态操作对象的能力。正常编程:类 → 对象 → 调用方法 反射:未知类 → 运行时拿到类结构 → 创建对象 / 调用方法 / 访问属性一、为什么需要反射?(先解决动机&am…...
C++类型推导与auto关键字
C类型推导与auto关键字 类型推导是C11引入的重要特性,通过auto和decltype关键字,编译器可以自动推导变量的类型,减少代码冗余并提高可维护性。 auto关键字让编译器根据初始化表达式推导变量类型。 #include #include #include #include v…...
跨镜头人物ID稳定性不足,深度拆解Sora 2的Temporal Identity Token机制与3层对抗对齐策略
更多请点击: https://kaifayun.com 第一章:跨镜头人物ID稳定性不足的根源诊断 跨镜头人物ID稳定性不足是多目标跟踪(MOT)系统在真实监控场景中面临的核心瓶颈。其本质并非单一模块失效,而是特征表征、时空建模与数据分…...
工业级字符识别实战:C#结合YOLO+Tesseract实现药品批号与电子元件丝印精准校验
在工业自动化生产线上,字符识别一直是质量管控的核心环节。从药品包装的批号、有效期到电子元件的丝印型号、批次号,每一个字符的错误都可能导致严重的产品质量问题甚至安全事故。 传统的OCR方案在面对工业场景时往往力不从心:字符倾斜、背景…...
