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

Python设计模式 - 简单工厂模式

定义

简单工厂模式是一种创建型设计模式,它通过一个工厂类来创建对象,而不是通过客户端直接实例化对象。

结构

在这里插入图片描述
工厂类(Factory):负责创建对象的实例。工厂类通常包含一个方法,根据输入参数的不同创建并返回不同的对象
产品类(Product):工厂类创建的对象接口或抽象类,所有具体产品类需要实现或继承这个接口或抽象类。
具体产品类(ConcreteProduct):实现了产品接口的具体类。

应用场景

  1. 多种产品对象的创建:当系统需要创建多种类型的对象(不宜过多),而且这些对象有着相似的结构或接口时,可以使用简单工厂模式来集中管理对象的创建逻辑。这有助于提高代码的可维护性和扩展性。例如,不同类型的图形对象、不同类型的报表生成器等。
  2. 避免直接实例化复杂对象:当对象的创建过程较为复杂,涉及多种初始化步骤时,可以使用简单工厂模式,将这些初始化步骤封装在工厂类中,简化客户端代码。例如,不同类型的数据库连接、复杂的对象初始化流程等。

优缺点

优点:

  1. 简化客户端代码:客户端代码不需要了解具体产品类的创建细节,只需调用工厂类的创建方法即可获得所需的对象。这减少了客户端代码的复杂性,使其更容易维护和理解。
  2. 集中管理对象的创建:对象的创建逻辑集中在工厂类中,便于统一管理和控制。这有助于在一个地方进行修改和调整,从而避免在多个地方重复修改代码,提高了代码的可维护性。
  3. 便于扩展:当需要增加新产品类时,只需在工厂类中添加相应的创建逻辑,客户端代码无需修改。这使得系统在一定程度上具有较好的扩展性。

缺点:

  1. 违背开闭原则:每当需要添加新的产品类型时,都必须修改工厂类以添加新的创建逻辑。这违反了开闭原则,增加了维护成本。
  2. 违背单一职责原则:工厂类不仅负责创建对象,还承担了对象的选择逻辑,可能会导致工厂类变得复杂,难以维护。
  3. 不可避免的条件判断:工厂类中通常会包含大量的条件判断语句(如if-else或switch-case),用于确定需要创建哪种类型的对象。这些条件判断语句会随着产品种类的增加而变得冗长且复杂。

代码示例

from abc import ABC, abstractmethodclass Shape(ABC):@abstractmethoddef draw(self):passclass Circle(Shape):def draw(self):return "Drawing a Circle"class Rectangle(Shape):def draw(self):return "Drawing a Rectangle"class ShapeFactory:@staticmethoddef create_shape(shape_type):if shape_type == "CIRCLE":return Circle()elif shape_type == "RECTANGLE":return Rectangle()else:raise ValueError("Unknown shape type")if __name__ == "__main__":# 使用工厂类创建对象shape = ShapeFactory.create_shape("CIRCLE")print(shape.draw())  # 输出: Drawing a Circleshape = ShapeFactory.create_shape("RECTANGLE")print(shape.draw())  # 输出: Drawing a Rectangle

参考

《设计模式的艺术》

相关文章:

Python设计模式 - 简单工厂模式

定义 简单工厂模式是一种创建型设计模式,它通过一个工厂类来创建对象,而不是通过客户端直接实例化对象。 结构 工厂类(Factory):负责创建对象的实例。工厂类通常包含一个方法,根据输入参数的不同创建并返…...

L55--- 257.二叉树的所有路径(深搜)---Java版

1.题目描述 2.思路 (1)因为是求二叉树的所有路径 (2)然后是带固定格式的 所以我们要把每个节点的整数数值换成字符串数值 (3)首先先考虑根节点,也就是要满足节点不为空 返回递归的形式dfs(根节…...

智慧园区解决方案PPT(53页)

## 1.1 智慧园区背景及需求分析 - 智慧园区的发展历程包括园区规划、经济、产业、企业、管理、理念的转变,强调管理模式创新,关注业务综合化、管理智慧化等发展。 ## 1.2 国家对智慧园区发展的政策 - 涉及多个国家部门,如工信部、住建部、…...

Windows安装MySQL(8.0.37)

安装:https://blog.csdn.net/XLBYYDS/article/details/139711682 注意点: (1)必须安装到C盘系统盘,否则执行 net start mysql 启动服务时,可能会启动失败。 (2)如果安装时出现 The…...

永磁同步电机驱动死区补偿

1 死区效应及补偿 1. 1 死区效应 在本文的电机控制嵌入式系统中,逆变器为三 相电压型桥式逆变电路,如图 1 所示。 在理想状态 下,上桥臂和下桥臂的控制信号满足互补通断原则, 即上桥臂开通时,下桥臂关断,反之亦然。 而在实际 应用中,开关管的通断需要一定的开通时…...

智能体合集

海外版coze: 前端代码助手 后端代码助手: 前端代码助手:...

智能农业管理系统设计

一、引言 随着物联网、云计算和大数据技术的快速发展,智能农业管理系统成为提高农业生产效率、优化资源配置、降低环境污染的重要手段。本设计旨在构建一个集数据采集、传输、处理、分析于一体的智能农业管理系统,为农业生产提供全方位、精准化的服务。 …...

Matlab的Simulink系统仿真(simulink调用m函数)

这几天要用Simulink做一个小东西,所以在网上现学现卖,加油! 起初的入门是看这篇文章MATLAB 之 Simulink 操作基础和系统仿真模型的建立_matlab仿真模型搭建-CSDN博客 写的很不错 后面我想在simulink中调用m文件 在 Simulink 中调用 MATLA…...

C语言中操作符详解(一)

众所周知,在我们的C语言中有着各式各样的操作符,并且在此之前呢,我们已经认识并运用了许许多多的操作符,都是诸君的老朋友了昂 操作符作为我们使用C语言的一个非常非常非常重要的工具,诸君一定要加以重视,…...

【论文阅读】Multi-Camera Unified Pre-Training via 3D Scene Reconstruction

论文链接 代码链接 多摄像头三维感知已成为自动驾驶领域的一个重要研究领域,为基于激光雷达的解决方案提供了一种可行且具有成本效益的替代方案。具有成本效益的解决方案。现有的多摄像头算法主要依赖于单目 2D 预训练。然而,单目 2D 预训练忽略了多摄像…...

深入了解NumPy的原理与使用

文章目录 一、引言二、NumPy的原理1. 多维数组对象2. 广播(Broadcasting)3. 内存效率和速度 三、NumPy的使用1. 创建数组2. 数组操作3. 广播(Broadcasting)示例 四、总结 一、引言 在Python的数据科学和科学计算领域,…...

Linux Centos 环境下搭建RocketMq集群(双主双从)

1、下载rocketmq的包 下载 | RocketMQ 2、配置环境变量 1、编辑环境变量文件:vim /etc/profile2、加入如下配置: #rocketmq 4.9.8 ROCKETMQ_HOME/home/rocketmq/rocketmq-4.9.8 export PATH${ROCKETMQ_HOME}/bin:${PATH}3、刷新配置:source…...

全网最全postman接口测试教程和项目实战~从入门到精通

Postman实现接口测试内容大纲一览: 一、什么是接口?为什么需要接口? 接口指的是实体或者软件提供给外界的一种服务。 因为接口能使我们的实体或者软件的内部数据能够被外部进行修改。从而使得内部和外部实现数据交互。所以需要接口。 比如&…...

【ARM】MDK Debug模式下Disassembly窗口介绍

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 主要了解Disassembly窗口中包含的内容,和如何利用Disassembly中的内容了解程序的存储和调用情况。 2、 问题场景 对于Disassembly窗口中具体包含的内容不了解,无法合理地应用Disassembly窗口…...

灵活的招聘管理系统有五种方法帮助成功招聘

还记得以前的时代吗?这取决于你的年龄,直到智能手机、流媒体电视和电子邮件出现。今天,任何活着的成年人都经历了技术上的巨大变化,这创造了一种新的行为方式。人才获取也是如此。 一个值得推荐的招聘管理系统 招聘团队被困在满足…...

美摄科技匿名化处理解决方案,包含模糊、同色、马赛克、效果遮挡等各种形式

信息安全已成为企业发展中不可忽视的重要一环,随着信息安全法规的日益严格和公众对个人隐私保护意识的不断提高,企业如何在保障业务顺畅进行的同时,满足信息安全和隐私保护的要求,成为了亟待解决的问题。美摄科技凭借其强大的技术…...

O2OA的数据库数据库配置-使用不同用户访问Oracle时报错-表或视图不存在

在使用Oracle数据库时,多个O2OA服务器同一个Oracle实例中使用不同的用户启动时,可能会遇到数据库访问的错误。本篇阐述此类问题以及解决方案。 一、先决条件: 1、O2OA已经下载并且解压到指定的目录; 2、Oracle数据库已经完成安…...

leetcode56 合并区间

题目 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 输入:intervals [[1,3],[2,6]…...

Elasticsearch扩展性探索:水平扩展与集群管理

在当今数据驱动的时代,搜索引擎和数据存储解决方案的重要性不言而喻。Elasticsearch,作为一款基于Lucene构建的开源、分布式、RESTful搜索引擎,凭借其强大的全文搜索、结构化搜索和分析能力,受到了众多企业和开发者的青睐。然而&a…...

node版本过高出现ERR_OSSL_EVP_UNSUPPORTED错误

错误原因: 新版本的nodejs使用的openssl和旧版本不同,导致出错 解决方法: 1.将node版本重新换回16.x 2 windows 下 在package.json文件下添加set NODE_OPTIONS--openssl-legacy-provider && "scripts": {"dev"…...

[260326] x-cmd v0.8.10:跨 Shell 统一配置命令短名;自动装好依赖运行 WhisperLiveKit 实时语音转写

[260326] x-cmd v0.8.10:跨 Shell 统一配置命令短名;自动装好依赖运行 WhisperLiveKit 实时语音转写 开放 shortcut 内部模块,配置命令短名,支持跨 Shell 统一使用whisper 模块新增 livekit 命令,自动装好依赖&#x…...

WordPress主题开发实战:从零开始搭建你的第一个自定义主题(2024最新版)

WordPress主题开发实战:从零开始搭建你的第一个自定义主题(2024最新版) 如果你正准备踏入WordPress主题开发的世界,这篇文章将带你从零开始构建一个完整的自定义主题。不同于简单的仿制或修改现有主题,我们将深入探讨如…...

雨课堂运动与健康网课高效学习指南

1. 雨课堂运动与健康网课学习资源整合 第一次接触雨课堂的运动与健康网课时,我和很多同学一样手忙脚乱。平台上的资料分散在各个角落,视频、文档、测试题混在一起,根本不知道从哪里开始。后来摸索出一套资源整理方法,效率直接翻倍…...

NaViL-9B多模态模型5分钟快速部署:图文问答零基础入门教程

NaViL-9B多模态模型5分钟快速部署:图文问答零基础入门教程 1. 认识NaViL-9B多模态模型 NaViL-9B是上海人工智能实验室推出的原生多模态大语言模型,它不仅能像传统语言模型一样处理纯文本问答,还具备强大的图片理解能力。这意味着你可以上传…...

6个高效突破内容访问限制的开源工具使用指南

6个高效突破内容访问限制的开源工具使用指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息爆炸的数字时代,优质内容常常被付费墙限制访问。本文将系统介绍基于开源…...

Unsloth Docker部署详解:从零开始搭建训练环境

Unsloth Docker部署详解:从零开始搭建训练环境 1. 环境准备与Docker安装 1.1 系统要求检查 在开始之前,请确保你的系统满足以下基本要求: 64位Linux系统(推荐Ubuntu 22.04)NVIDIA显卡驱动已安装(建议版…...

ncmdumpGUI:突破网易云音乐NCM格式限制的高效解决方案

ncmdumpGUI:突破网易云音乐NCM格式限制的高效解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI ncmdumpGUI是一款开源的音频格式转换工具&am…...

5分钟解锁WeMod专业版:开源工具让你的游戏修改体验全面升级

5分钟解锁WeMod专业版:开源工具让你的游戏修改体验全面升级 【免费下载链接】Wemod-Patcher WeMod patcher allows you to get some WeMod Pro features absolutely free 项目地址: https://gitcode.com/gh_mirrors/we/Wemod-Patcher 还在为WeMod专业版的订阅…...

[2026 职场洗牌系列 01] 程序员正在“杀死”自己的工作?科技行业高危预警

长久以来,学计算机(CS)在很多年轻人眼里就等同于拿到了通往高薪和阶层跃升的金钥匙。大家都觉得,只要把代码敲得溜,这辈子在职场上基本就稳了。可惜,到了2026年的今天,生成式AI正在毫不留情地把…...

I2CLCD驱动库:HD44780字符屏的I²C轻量级嵌入式适配方案

1. I2CLCD库概述:面向嵌入式系统的字符型LCD IC适配驱动I2CLCD是一个轻量级、可移植的C语言驱动库,专为将标准HD44780兼容的字符型LCD(如1602、2004)通过IC总线接入MCU而设计。其核心价值在于消除并行接口对GPIO资源的高占用&…...