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

news2024/10/6 20:53:22

1. 引言

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

2. 什么是简单工厂模式

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

3. 简单工厂模式的实现

示例一:形状工厂

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

代码实现
class Shape:
    def draw(self):
        pass

class Circle(Shape):
    def draw(self):
        print("Drawing a Circle")

class Square(Shape):
    def draw(self):
        print("Drawing a Square")

class ShapeFactory:
    @staticmethod
    def 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 Circle

shape2 = 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):
        pass

class InfoLogger(Logger):
    def log(self, message):
        print(f"INFO: {message}")

class ErrorLogger(Logger):
    def log(self, message):
        print(f"ERROR: {message}")

class LoggerFactory:
    @staticmethod
    def 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):
        pass

class MySQLConnection(DatabaseConnection):
    def connect(self):
        print("Connecting to MySQL database...")

class PostgreSQLConnection(DatabaseConnection):
    def connect(self):
        print("Connecting to PostgreSQL database...")

class DatabaseConnectionFactory:
    @staticmethod
    def 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.coloradmin.cn/o/1885961.html

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

相关文章

nextTick实现原理及使用场景

1.定义: nextTick是一个在Vue.js中常见的异步更新DOM的机制,它利用JavaScript的事件循环机制以及浏览器的渲染流程来实现延迟执行DOM更新操作。nextTick方法能够将回调函数延迟到下一个DOM更新循环之后执行,确保在DOM更新完成后执行某些操作…

【Linux系统】CUDA的安装

今天在安装环境时遇到报错: The detected CUDA version (10.1) mismatches the version that was used to compile PyTorch (11.8). Please make sure to use the same CUDA versions. 报错原因:安装的cuda版本不对应,我需要安装cuda的版本…

宠物空气净化器哪个品牌性价比高?宠物空气净器Top3品牌推荐

养猫确实给家庭带来了无尽的欢乐,但猫毛无处不在的问题确实让不少猫主人感到头疼。不论是长毛猫还是短毛猫,它们掉落的浮毛飘浮在空气中,不仅影响家居环境的整洁度,还可能成为过敏的源头。因此,如何高效地处理这些猫浮…

多模态融合 + 慢病精准预测

多模态融合 慢病精准预测 慢病预测算法拆解子解法1:多模态数据集成子解法2:实时数据处理与更新子解法3:采用大型语言多模态模型(LLMMs)进行深度学习分析 慢病预测更多模态 论文:https://arxiv.org/pdf/2406…

创新校园服务模式 跑腿小程序平台源码构建与实践 前后端分离 带完整的安装代码包以及部署教程

系统概述 本项目是一个集任务发布、接单、支付、评价于一体的跑腿服务小程序平台,专为高校校园设计。系统采用前后端分离架构,前端负责用户界面展示和交互逻辑,后端处理业务逻辑、数据存取等,两者通过API接口进行通信&#xff0c…

『手撕Vue-CLI』 添加自定义指令

添加 create 指令 在 vue-cli 中,create 指令是用来创建一个新的项目的,我实现的 nue --help 的帮助信息中只有 --version,--help 这两个指令,所以当用户使用我的 nue-cli 时,并不知道有 create 这个指令,所…

Conan安装与C++第三方环境配置保姆级图文教程(附速查字典)

目录 1 什么是Conan?2 Conan安装与配置3 Conan的常见操作3.1 搜索指定包3.2 安装指定包3.3 本地包管理3.4 查看项目依赖 4 Conan构建项目案例 1 什么是Conan? Conan是一个开源的C/C包管理器,用于管理和构建C/C项目所需的依赖库。传统上&…

BIOS设置与系统分区

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 目录 一BIOS 1破解密码的前提 2B…

CrossViT:用于图像分类的交叉注意多尺度Vision Transformer

提出了一种双支路Transformer来组合不同大小的图像补丁(即变压器中的令牌)以产生更强的图像特征。方法处理具有不同计算复杂度的两个独立分支的小补丁和大补丁令牌,然后这些令牌纯粹通过注意多次融合以相互补充。此外,为了减少计算量,开发了一个简单而有效的基于交叉关注的令…

98 - IDEA远程调试服务器Java程序

Java 提供了一套标准的调试协议(JDWP - Java Debug Wire Protocol),允许调试器(IDE)与被调试程序(应用)之间进行通信。 1.服务器特定命令启动程序 在服务器上以以下命令启动Java程序 java -a…

linux 离线安装docker

测试服务器:银河麒麟V10 x86_64 注意:推荐使用国内的镜像站下载,因为官网不挂梯子无法访问,我用的是清华大学开源软件镜像站 一、下载离线包: 官网下载docker离线包 下载地址:https://download.docker.c…

老师怎样一键发布期末考试成绩?

期末考试的钟声一响,老师们便开始了紧张的阅卷工作。成绩出来后,他们又面临着一项繁琐的任务——将成绩单逐一私信给每位学生的家长。这不仅耗费了大量时间,也让老师们在繁忙的期末工作中倍感压力。期末老师的工作已经够多够繁琐,…

仪器校准的概念与定义,计量校准是什么?

仪器校准的定义,在之前所颁布的《国际计量学词汇 基础和通用概念及相关术语》文件中,已经有了明确说明,而该文件做了修改以后,在后续新的定义中,仪器校准具体被分为两部分,第一步是将被计量仪器和计量校准的…

汽车制造企业中MES管理系统还有哪些作用

在当今汽车制造业的飞速发展中,数字化转型已成为企业不可或缺的战略选择。在这个转型浪潮中,MES管理系统扮演着至关重要的角色,成为连接企业资源计划(ERP)与车间自动化系统的关键纽带。它不仅推动了生产流程的智能化、…

SpringSecurity中文文档(Servlet Persisting Authentication)

Persisting Authentication 用户第一次请求受保护的资源时,系统会提示他们输入凭据。提示凭据的最常见方法之一是将用户重定向到登录页。对于请求受保护资源的未经身份验证的用户,总结的 HTTP 交换可能如下所示: Example 1. Unauthenticated User Requ…

数据库测试数据准备厂商 Snaplet 宣布停止运营

上周刚获知「数据库调优厂商 OtterTune 宣布停止运营」。而今天下班前,同事又突然刷到另一家海外数据库工具商 Snaplet 也停止运营了。Snaplet 主要帮助开发团队在数据库中生成仿真度高且合规的测试数据。我们在年初还撰文介绍过它「告别手搓!Postgres 一…

deepin基于rsync和apt-mirror同步软件源及构建本地内网源

一、rsync方式 参考官方文档地址: https://www.deepin.org/index/docs/wiki/05_HOW-TO/08_%E9%95%9C%E5%83%8F%E5%8A%A0%E9%80%9F/%E8%BD%AF%E4%BB%B6%E6%BA%90.md 仓库同步命令所需大小软件仓库rsync -av --delete-after rsync.deepin.com::deepin/ /var/www/deep…

利用STM32的定时器输出PWM方波

脉冲宽度调制 (PWM) ,是英文“ Pulse Width Modulation ”的缩写,简称脉宽调制,是利用 微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽 度的控制。 图中,我们假定定时器工作在…

【neo4j图数据库】入门实践篇

探索数据之间的奥秘:Neo4j图数据库引领新纪元 在数字化浪潮汹涌的今天,数据已成为企业最宝贵的资产之一。然而,随着数据量的爆炸性增长和数据关系的日益复杂,传统的关系型数据库在处理诸如社交网络、推荐系统、生物信息学等高度互…