【Python设计模式03】简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它通过专门定义一个工厂类来负责创建其他类的实例,而不是在客户端代码中直接实例化对象。这样可以将对象创建的过程与使用对象的过程分离,提高代码的可维护性和可扩展性。

简单工厂模式的结构

简单工厂模式包含以下角色:

  1. 工厂类(Factory):负责创建对象的类。根据不同的条件,实例化并返回不同类型的对象。
  2. 产品类(Product):由工厂创建的对象,所有创建的对象应实现相同的接口或继承相同的基类。
  3. 客户端(Client):使用工厂类来获取产品对象,而不直接实例化产品类。

示例

假设我们要创建一个简单的工厂类来生成不同类型的动物对象。首先,我们定义一个Animal基类,然后定义两个具体的产品类DogCat,最后创建一个工厂类AnimalFactory来生成这些对象。

定义产品类
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: str) -> Animal:if animal_type == 'dog':return Dog()elif animal_type == 'cat':return Cat()else:raise ValueError(f"Unknown animal type: {animal_type}")
使用工厂类
def main():factory = AnimalFactory()dog = factory.create_animal('dog')print(dog.speak())  # 输出:Woof!cat = factory.create_animal('cat')print(cat.speak())  # 输出:Meow!try:unknown = factory.create_animal('bird')except ValueError as e:print(e)  # 输出:Unknown animal type: birdif __name__ == "__main__":main()

简单工厂模式的优缺点

优点
  1. 单一职责原则:工厂类负责对象的创建,客户端代码负责使用对象,各自关注自己的职责。
  2. 提高可维护性:将对象创建的逻辑集中在一个地方,便于修改和维护。
  3. 提高可扩展性:如果需要添加新的产品,只需修改工厂类而不需要修改客户端代码。
缺点
  1. 违反开闭原则:每次添加新产品时,都需要修改工厂类,增加了工厂类的复杂性。
  2. 单一工厂类过于复杂:随着产品种类的增加,工厂类可能变得臃肿,难以维护。

简单工厂模式的适用场景

  1. 对象创建过程复杂:如果对象的创建过程较为复杂,或者需要根据不同条件创建不同类型的对象,可以使用简单工厂模式。
  2. 客户端不需要知道具体产品类:客户端只需要使用工厂类来获取对象,不需要了解具体的产品类。

总结

简单工厂模式是一种创建型设计模式,通过定义一个工厂类来创建不同类型的对象,将对象创建的过程与使用对象的过程分离,提高代码的可维护性和可扩展性。尽管简单工厂模式有一些缺点,如违反开闭原则,但在某些场景下仍然非常有用。通过合理使用简单工厂模式,可以有效地简化对象的创建过程,提升代码的质量。

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

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

相关文章

【权威出版】2024年土木工程、抗震构造与材料技术国际会议(CSCMT 2024)

2024年土木工程、抗震构造与材料技术国际会议 2024 International Conference on Civil Engineering, Seismic Construction, and Material Technology 【1】会议简介 2024年土木工程、抗震构造与材料技术国际会议即将召开,这是一次集结全球土木工程、抗震构造与材料…

网络其他重要协议(DNS、ICMP、NAT)

1.DNS DNS是一整套从域名映射到IP的系统 1.1 DNS背景 TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆,例如我们想访问百度就会在浏览器中输入baidu.com而不是百度的IP地址。于是人们发明了一种叫主机名的东西, 是…

瞄准金融行业的远控木马:SpyNote

Android 间谍软件是最常见的恶意软件之一,攻击者通过 Android 间谍软件来跟踪用户位置、检查 Web 浏览记录,甚至窃取敏感信息(密码和信用卡号等),其对银行机构与客户构成的威胁与 Android 银行木马相媲美。间谍软件还可…

dubbo 无注册中心 通过url直接调用

1、依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

消息回复及时,客户不流失!这个微信自动回复设置快快码住!

你是不是也遇到过由于回复不及时&#xff0c;导致客户流失的情况发生&#xff1f;或是好友申请太多&#xff0c;来不及通过&#xff1f; 别担心&#xff0c;试试个微管理系统&#xff0c;让你实现自动回复&#xff0c;提高回复效率&#xff01; 1、自动通过好友 当有新的好友…

SpringBootTest测试框架二

sql的mock 注入sql的拦截器,对查询语句拦截,按规则访问本地路径的文件,实现mock功能。 @Intercepts(value = {@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),@Signature(type = Executor.class, method =…

Suricata-入门实验-快速理解suricata

实验环境&#xff1a; 主机win10 ip地址&#xff1a;192.168.121.1 虚拟机使用vm ubuntu20.04 ip地址&#xff1a;192.168.121.128 实验目标&#xff1a; 从主机 给虚拟机 发送ping 命令 虚拟机中Suricata接收到ping后发出告警信息。 正文 在前面 编译好Suricata后&#x…

postman调用Grpc

环境&#xff1a; .net6.0 一、准备 安装nuget&#xff1a; Grpc.AspNetCore Google.Protobuf Grpc.Core.Api Grpc.Tools Grpc.AspNetCore.Server.Reflection Program.cs&#xff1a; public class Program{public static void Main(string[] args){var builder WebApplicat…

报名倒计时!「飞天技术沙龙-CentOS 迁移替换专场」参会指南

为帮助广大用户诊断 CentOS 迁移替换过程中的疑难杂症&#xff0c;「飞天技术沙龙-CentOS 迁移替换专场」将于 5 月 29 日&#xff08;周三&#xff09;在北京举办&#xff0c;将围绕如何在确保服务的连续性和稳定性的前提下实现平滑迁移及如何最大限度地利用现有资源前提下确保…

App Inventor 2 Encrypt.Security 安全性扩展:MD5哈希,SHA/AES/RSA/BASE64

这是关于App Inventor和Thunkable安全性的扩展&#xff0c;它提供MD5哈希&#xff0c;SHA1和SHA256哈希&#xff0c;AES加密/解密&#xff0c;RSA加密/解密&#xff0c;BASE64编码/解码方法。 权限 此扩展程序不需要任何权限。 事件 OnErrorOccured 抛出任何异常时将触发此事件…

前端 CSS 经典:图片边框

前言&#xff1a;有这么一个业务&#xff0c;需要边框随着图片宽度的变化而变化&#xff0c;比如一些聊天的气泡框等。 实现原理&#xff1a;使用 border-image 属性 效果图&#xff1a; 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><he…

【区块链】caliper压力测试

本文上接postman接口测试 参照工程项目使用Caliper测试工具对食品安全溯源系统智能合约生成新食品(newFood)功能进行压力测试 首先启动webase python3 deploy.py startAll vim /opt/bencahmark/caliper-benchmark/networks/fisco-bcos/test-nw/fisco-bcos.json 命令便捷查…

书籍龙与地下城游戏问题(4)0527

题目&#xff1a; 给定一个二维数组map。含义是一张地图&#xff0c;例如&#xff0c;如下矩阵&#xff1a; -2 -3 3 -5 -10 1 0 30 -5 游戏的规则如下&#xff1a; 骑士从左上角出发&#xff0c;每次只能向右或向下走&#xf…

Web3 游戏周报(5.19 - 5.25)

【5.19 - 5.25】Web3 游戏行业动态&#xff1a; Arbitrum 已开启 “2 亿枚 ARB 游戏催化剂计划”的提案投票。 STEPN 在官方 X 宣布将推出全新社交健身应用 STEPN GO。 Oasys 正式推出《足球小将》漫改 Web3 游戏《Captain Tsubasa-RIVALS-》。 Gala Games &#xff1a;已销…

❤职场小心得❤

在职场中&#xff0c;我深刻地认识到了沟通与合作的重要性。在团队中&#xff0c;每个人都有自己的专业知识和技能&#xff0c;只有通过良好的沟通和合作&#xff0c;才能将每个人的优势结合起来&#xff0c;共同完成任务。 首先&#xff0c;沟通是职场中不可或缺的能力。有效的…

华为交换机基础实验----VLAN基础

交换机篇实验&#xff1a; 给交换机创建VLAN 1.单个VLAN的创建 [S]vlan 10 查看的方法&#xff1a;dis vlan 2.批量创建vlan的方法 Vlan b 20 30 40 连续创建三个vlan&#xff0c;分别为vlan20 vlan30和vlan40 [SONY-S1-vlan10]vlan b 20 30 40 3.批量创建连续的vlan&#xf…

React的生命周期总结

React组件的生命周期可以概述为几个关键阶段&#xff1a;挂载&#xff08;Mounting&#xff09;、更新&#xff08;Updating&#xff09;、卸载&#xff08;Unmounting&#xff09;&#xff0c;以及错误处理。随着React的发展&#xff0c;特别是引入Hooks之后&#xff0c;经典类…

Vue3的watch监视

watch watch用于观察和响应组件中数据变化。 在Vue 3中&#xff0c;watch属性不仅可以用于监视Vue实例数据的变化&#xff0c;并在数据发生变化时执行相应的操作&#xff1b;并且可以在监视数据变化的同时&#xff0c;在变化时执行回调函数&#xff0c;从而实现对数据的监听和…

【Qt Creator】跨平台的C++图形用户界面应用程序开发框架---QT

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.互联网的核心岗位以及职…

宝塔下新增站点 No Input File Specified.错误修复

今天明月收到了一个购买【站长必备在线工具源码含上百款工具-博客优化修复版】用户的求助&#xff0c;在宝塔里新增网站部署好工具源码后&#xff0c;访问出现“No input file specified.”的提示。其实出现这个提示一般都是 PHP 文件无法被解析造成的。 简单排查了一下宝塔相关…