轻松创建对象——简单工厂模式(Python实现)

1. 引言

大家好,又见面了!今天我们要聊的是设计模式中的“万能钥匙”——简单工厂模式。想象一下,如果每次你都得亲自动手创建各种对象,不仅累得像个陀螺,还可能搞得一团糟。别怕,简单工厂模式来拯救你!它就像一个神奇的工厂,可以根据你的需求生产出各种对象。今天,我们就来揭开这个神奇模式的面纱,让你轻松创建对象不再烦恼。准备好了吗?Let’s go!

2. 什么是简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它定义一个工厂类,根据传入的参数决定创建哪一种产品类的实例。简单来说,简单工厂模式就是把创建对象的任务交给一个专门的工厂类,让工厂来决定生产哪种对象,咱们只需安心享用即可。

3. 简单工厂模式的实现

示例一:形状工厂

假如你是个艺术家,需要画各种形状,圆形、方形啥的,你可以用简单工厂模式让工厂帮你搞定这些形状对象:

代码实现
class Shape:def draw(self):passclass Circle(Shape):def draw(self):print("Drawing a Circle")class Square(Shape):def draw(self):print("Drawing a Square")class ShapeFactory:@staticmethoddef create_shape(shape_type):if shape_type == "circle":return Circle()elif shape_type == "square":return Square()else:return None# 使用示例
factory = ShapeFactory()
shape1 = factory.create_shape("circle")
shape1.draw()  # 输出: Drawing a Circleshape2 = factory.create_shape("square")
shape2.draw()  # 输出: Drawing a Square
详细代码解析
  • Shape是个接口类,定义了draw方法,咱们所有的形状都要实现它;
  • CircleSquare类分别实现了Shape接口,具体画啥样子它们说了算;
  • ShapeFactory类有个静态方法create_shape,根据传入的形状类型参数创建并返回对应的形状对象;
  • 我们只需通过调用ShapeFactory.create_shape方法并传入形状类型,就能轻松得到相应的形状对象。
示例二:日志记录器工厂

现在你是个开发者,搞个日志系统,你想要不同级别的日志记录器来帮你分门别类记录信息,简单工厂模式也能派上用场:

代码实现
class Logger:def log(self, message):passclass InfoLogger(Logger):def log(self, message):print(f"INFO: {message}")class ErrorLogger(Logger):def log(self, message):print(f"ERROR: {message}")class LoggerFactory:@staticmethoddef create_logger(logger_type):if logger_type == "info":return InfoLogger()elif logger_type == "error":return ErrorLogger()else:return None# 使用示例
logger_factory = LoggerFactory()
info_logger = logger_factory.create_logger("info")
info_logger.log("This is an informational message.")  # 输出: INFO: This is an informational message.error_logger = logger_factory.create_logger("error")
error_logger.log("This is an error message.")  # 输出: ERROR: This is an error message.
详细代码解析
  • Logger是个接口类,定义了log方法;
  • InfoLoggerErrorLogger类实现了Logger接口,分别负责记录不同级别的日志;
  • LoggerFactory类的静态方法create_logger根据传入的日志类型参数创建并返回对应的日志记录器对象;
  • 你只需通过调用LoggerFactory.create_logger方法并传入日志类型参数,就能得到相应的日志记录器对象。
示例三:数据库连接工厂

假如你现在是个DBA,需要管理多个数据库连接,简单工厂模式同样能帮你搞定这个问题:

代码实现
class DatabaseConnection:def connect(self):passclass MySQLConnection(DatabaseConnection):def connect(self):print("Connecting to MySQL database...")class PostgreSQLConnection(DatabaseConnection):def connect(self):print("Connecting to PostgreSQL database...")class DatabaseConnectionFactory:@staticmethoddef create_connection(db_type):if db_type == "mysql":return MySQLConnection()elif db_type == "postgresql":return PostgreSQLConnection()else:return None# 使用示例
db_factory = DatabaseConnectionFactory()
mysql_connection = db_factory.create_connection("mysql")
mysql_connection.connect()  # 输出: Connecting to MySQL database...postgresql_connection = db_factory.create_connection("postgresql")
postgresql_connection.connect()  # 输出: Connecting to PostgreSQL database...
详细代码解析
  • DatabaseConnection是个接口类,定义了connect方法;
  • MySQLConnectionPostgreSQLConnection类实现了DatabaseConnection接口,分别负责不同数据库的连接;
  • DatabaseConnectionFactory类的静态方法create_connection根据传入的数据库类型参数创建并返回对应的数据库连接对象;
  • 你只需通过调用DatabaseConnectionFactory.create_connection方法并传入数据库类型参数,就能得到相应的数据库连接对象。

4. 简单工厂模式的优缺点

优点
  • 解耦:把对象的创建过程封装在工厂类里,客户端代码只需关心怎么用,不用关心怎么创建;
  • 灵活性:通过工厂类可以灵活地创建不同类型的对象,扩展性杠杠的。
缺点
  • 违背开闭原则:每次新增对象类型,都得改工厂类,比较麻烦;
  • 单一职责问题:工厂类负责创建所有对象,复杂项目里可能会比较臃肿。

6.示意图

图片来源:https://xie.infoq.cn/article/270b6bbfd752d9906bf0a09df

img

7. 总结

简单工厂模式就是这么神奇,它让对象的创建变得简单又高效,适用于各种需要灵活创建对象的场景。虽然它有一些缺点,但在大多数情况下,简单工厂模式依然是个非常实用的设计模式。
希望今天的分享能让大家对简单工厂模式有更深入的理解。如果你在项目中也用到了简单工厂模式,欢迎留言分享你的经验和见解!
在这里插入图片描述

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

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

相关文章

2024年创业新商机组合拳“消费增值+二二复制”引流拓客新思路

文丨微三云胡佳东,点击上方“关注”,为你分享市场商业模式电商干货。 - 引言:2024年各行各业面临企业经营瓶颈难的一年,国家也陆续推出了《关于打造消费新场景培育消费新增长点的措施》都是为了培育和壮大消费新增长点&#xff…

怎样恢复数据?电脑数据恢复方法详解!

在日常使用电脑或移动设备时,我们难免会遇到数据丢失的情况,如误删除文件、存储设备故障等。数据恢复成了许多人迫切需要解决的问题。本文将为您介绍几种高效的数据恢复方法,帮助您轻松找回丢失的文件。 一、了解数据丢失的原因 在恢复数据…

数据文件传输连接超时?镭速教你如何解决!

Mysql作为一个广泛使用的开源关系型数据库管理系统,以快速、可靠、易于使用、开源的特色闻名,使用 MySQL 来存储和管理数据,已经广泛应用于各个领域、各类大小型应用中。 图片源于网络 使用 MySQL 来存储和管理数据的应用中,与数…

关于 element-ui el-cascader 数据回显问题的解决方案

前言 这两天在使用 el-cascader 控件时,后端日期的数据如“2023-05-06”前端需要按照“年-月-日”的形式分割成三级联动,因为数据库保存的是完整的日期,前端数据回显时需要对后端返回的数据进行处理。 问题再现 联动下拉框的数据如下&#x…

【操作系统】进程管理——线程管理(个人笔记)

学习日期:2024.7.2 内容摘要:线程的概念、存在的意义、线程的属性,线程的实现方式,线程的状态与组织。 线程的概念 拿QQ来说,QQ既可以打视频电话,也可以在这同时进行文字聊天或传送文件,进程是…

零信任沙箱在数据安全领域的意义

在当今日益复杂的网络安全环境中,零信任沙箱作为一种前沿的安全防护技术,受到了广泛关注。而SDC沙箱作为零信任沙箱领域的佼佼者,凭借其独特的技术优势和卓越的价值,为企业和组织提供了强大的数据安全保障。本文将深入探讨SDC沙箱…

【postgresql】数据库操作

创建数据库 使用 CREATE DATABASE SQL 语句来创建 语法: CREATE DATABASE dbname; 使用 createdb 命令来创建 语法: createdb [option...] [dbname [description]] 参数说明: dbname:要创建的数据库名。 description&…

成人职场商务英语学习柯桥外语学校|邮件中的“备注”用英语怎么说?

在英语中,"备注"通常可以翻译为"Notes" 或 "Remarks"。 这两个词在邮件中都很常用。例如: 1. Notes Notes: 是最通用和最常见的表达,可以用在各种情况下,例如: 提供有关电子邮件内容的附加信息 列…

每日一题——Python实现PAT乙级1100 校庆(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码结构和逻辑 时间复杂度分析 空间复杂度分析 总结 我要更强 方法一…

什么美业门店管理系统好用?2024美业收银系统软件排名分享

美业SAAS系统在美容、美发、美甲等行业中十分重要,这种系统为美业提供了一种数字化解决方案,帮助企业更高效地管理业务和客户关系。 美业门店管理系统通常提供预约管理、客户管理、库存管理、报表生成等一系列功能,以满足美容院、美发沙龙等…

【AIGC评测体系】大模型评测指标集

大模型评测指标集 (☆)SuperCLUE(1)SuperCLUE-V(中文原生多模态理解测评基准)(2)SuperCLUE-Auto(汽车大模型测评基准)(3)AIGVBench-T2…

Linux 实现自定义系统调用,支持参数和结果返回

本文实现一个简单的系统调用实现,支持输入字符串参数,并返回一个结果字符串。 以下是验证步骤: 1. 添加系统调用编号 试验使用的是 x86_64 架构的 Linux 内核。 找到并编辑 arch/x86/entry/syscalls/syscall_64.tbl 文件,在文件…

机械行业常见问题及ERP解决办法

机械行业在全球经济一体化和技术进步背景下,面临着越来越多的挑战。为了在激烈的市场竞争中立于不败之地,企业需要找到合适的方法优化生产流程、降低成本、提升客户满意度。因此,有效地利用企业资源规划(ERP)解决方案变…

C# new关键字的三种用法

在C#中,new关键字具有多种不同的用途,主要包括以下三个: 1.作为运算符: 创建对象和调用构造函数:这是最常见的用法,用于在堆上分配内存并初始化一个类的新实例。例如: Person person new Pe…

65.WEB渗透测试-信息收集- WAF、框架组件识别(5)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:64.WEB渗透测试-信息收集- WAF、框架组件识别(4)-CSDN博客 waf绕…

DSSAT作物模建模实践方法

随着数字农业和智慧农业的发展,基于过程的作物生长模型(Process-based Crop Growth Simulation Model)在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。Decisi…

BMA580 运动传感器

型号简介 BMA580是博世(bosch-sensortec)的一款先进的、超小型加速度传感器。具有独特的骨传导语音活动检测功能和先进的功率模式功能,是世界上最小的加速度传感器(1.2 x 0.8 x 0.55 mm)。它专为紧凑型设备&#xff08…

2024年建筑八大员(质量员-土建专业)考试题库。全面提升考试成绩,轻松过级!

1.砖基础施工时,砖基础的转角处和交接处应同时砌筑,当不能同时砌筑时,应留置()。 A.直槎 B.凸槎 C.凹槎 D.斜槎 答案:D 2.分项工程施工前技术准备工作,主要指把拟定的分项工程施工前所需要…

Python的库dataperp读取excel和csv

领导说这个很牛,不过咱们不能听别人一口之言,咱们应该亲手试试,在来说这个好或者不好。 这个dataprepe已经不维护了,最高只支持python3.11以下版本,建议选择3.9. 他只能处理dataframe格式的数据,也就是pandas加载后的数…

Python模拟火焰文字效果:炫酷的火焰字动效

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义火焰效果类主循环 完整代码 引言 火焰文字效果是一种炫酷的视觉效果,常用于广告、游戏和艺术设计中。在这篇博客中,我们将使用Python创建一个火焰文字的动画效果。通过利用Py…