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

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.mfbz.cn/a/764620.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SciencePub学术刊源 | 7月SCI/SSCI/EI/CNKI刊源表已更新!(内含TOP及CCF推荐)

【SciencePub学术】我处SciencePub学术2024年7月SCI/SSCI/EI/CNKI刊源表已更新!内含多本中科院TOP、CCF推荐以及进展超顺的优质期刊,最快1-3个月录用! 计算机领域重点SCI 环境地质化学领域重点SCI 生物医学领域重点SCI 数学材料领域重点SCI 各…

grpc学习golang版( 二、入门示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、环境二、编写protobuf文件三、编写server服务端四、编写Clie…

不用找了!这个软件自带各行业话术,客服效率飞跃

有一款客服工具软件,不但能吸附聊天窗口,实现图文视频话术的一键发送,还内置了多行业的优质客服话术模板,允许用户直接下载使用,快速构建起适合自身企业的专业客服知识库。 前言 在今天的快节奏商业环境中&#xff0c…

同星TTS系列产品全新亮相:让开发测试变得更简单!

TTS系列产品 如果需要完整地测试 ECU,不仅需要将通信网络连接到测试系统,还需要连接 I/O 接口。同星的TTS测试系统将连接 I/O 通道所需的所有电路组件集成在一个模块中,可以极大地简化测试台架和HIL测试系统的设置,提高搭建和测试…

使用工业自动化的功能块实现大语言模型应用

大语言模型无所不能? 以chatGPT为代表的大语言模型横空出世,在世界范围内掀起了一场AI革命。给人的感觉似乎大模型语言无所不能。它不仅能够生成文章,图片和视频,能够翻译文章,分析科学和医疗数据,甚至可以…

当下环境下如何提升自己以拥抱未来的机会-程序员的自我提升

一、前言 看看今年的行情,无论是国内还是国外,仿佛都没有什么活力,经济下行压力越来越大,企业经营越来越困难。对于程序员的工作机会越来越少。这可能是现阶段乃至几年内的现象。现在是现金为王,拥有其他资产仿佛没有多大的增值空间,经济一片惨淡,消费不活跃,我看到的…

nextTick实现原理及使用场景

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

为什么要学习大模型应用开发?原因80%的人都不知道

0 prompt engineer 就是prompt工程师它的底层透视。 1 学习大模型的重要性 底层逻辑 人工智能大潮已来,不加入就可能被淘汰。就好像现在职场里谁不会用PPT和excel一样,基本上你见不到。你问任何一个人问他会不会用PPT,他都会说会用&#x…

已解决java.security.acl.NotOwnerException:在ACL中尝试执行非所有者的操作的正确解决方法,亲测有效!!!

已解决java.security.acl.NotOwnerException:在ACL中尝试执行非所有者的操作的正确解决方法,亲测有效!!! 目录 问题分析 出现问题的场景 用户类和ACL初始化 报错原因 解决思路 解决方法 1. 验证所有者身份 示…

CID引流电商:助力传统电商突破重围实现持续增长

摘要:面临流量成本攀升和市场份额被挤压的挑战,传统电商急需突破重围。CID引流电商通过跨平台引流和精准定位,助力商家实现持续增长,丰富营销手段,创新商业模式。CID引流电商为传统电商的长远发展注入新动力。 在电商…

Navicat报错码:2002 - Can‘t connect to server on localhost‘ (10061)如何解决?

许久没打开数据库,今天一看,怎么数据库连接失败了,网上查找资料后,解决了! 希望能帮到你。 报错码:2002 - Cant connect to server on localhost (10061) 报错场景:Navicat连接数据库时报错 …

[图解] 向量数据库之何谓乘积量化器?

Product Quantization 在前面一节讲解了向量数据库索引相关的内容,那么本节将会讲解其中压缩方法的量化手段:乘积量化器。 简单来说将向量的所有维度划分为多个子空间,每个子空间一部分维度,然后每个子空间独立去找最近距离。例如…

LeetCode-刷题记录-二分法合集(本篇blog会持续更新哦~)

一、二分查找概述 二分查找(Binary Search)是一种高效的查找算法,适用于有序数组或列表。(但其实只要满足二段性,就可以使用二分法,本篇博客后面博主会持续更新一些题,来破除一下人们对“只有有…

【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的版本…

雷池WAF+Modsecurity安装防护及系统加固

君衍. 一、雷池WAF1、什么是雷池2、什么是WAF3、雷池的功能4、WAF部署架构5、整体检测流程 二、雷池WAF环境依赖1、查看本地CPU架构2、Docker安装2.1 卸载旧版本2.2 安装yum-utils工具包2.3 设置镜像仓库2.4 安装docker2.5 启动docker并查看版本 3、Docker Compose安装3.1 卸载…

go使用grpc编辑器 windows

先看最后效果: 当我执行 protoc --go_out. proto.proto 会生成proto.pb.go文件,主要存储的是封装好的结构体 执行 protoc --go-grpc_out. proto.proto 会生成对应的方法 那么现在提供解决方案: https://github.com/protocolbuffers…

如何定制化 ListView 界面

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。 😊 座右铭:不…

计算机视觉概述

The main role of computer vision is to get information through input images. 1、Overview 计算机视觉中关于图像识别有四大类任务: (1)分类-Classification:解决“是什么?”的问题,即给定一张图片或…

echarts legend组件单独设置样式形状

为legend组件单独设置一个样式 //单独legend样式 const customLegend {name: test,// 设置文本为红色textStyle: {color: red} } legend: {data: [Email, Union Ads, Video Ads, Direct, Search Engine, customLegend ] }注意事项:series里面也必须配置与legend相对…

offer7.重建二叉树

根据二叉树的前序遍历和中序遍历重建二叉树 问题描述:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3…