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

server/2024/9/18 12:46:45/ 标签: python, 设计模式, 简单工厂模式

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

简单工厂模式的结构

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

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

示例

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

定义产品类
python">class Animal:def speak(self):passclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"
定义工厂类
python">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}")
使用工厂类
python">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.ppmy.cn/server/42512.html

相关文章

成都爱尔周进院长提醒当双眼度数差距过大,我们该做些什么

每个人的用眼方式、用眼习惯且两只眼睛“天生条件”不一定相同,当发生近视,双眼近视程度也就可能不同,双眼度数必然会变得不一样。当双眼度数产生差异,尤其是当双眼度数差别过大时会引发哪些问题? 双眼度数不一致&…

安卓手机APP开发__Kotlin编程语言的面向对象开发介绍

安卓手机APP开发__Kotlin编程语言的面向对象开发介绍 概述 本文描述一下接口的编写,类的接口继承,类的属性和方法的编写 错误的代码的示例 fun main() {Quiz().printProgressBar() }interface ProgressPrintable {val progressText: Stringfun print…

H800基础能力测试

H800基础能力测试 参考链接A100、A800、H100、H800差异H100详细规格H100 TensorCore FP16 理论算力计算公式锁频安装依赖pytorch FP16算力测试cublas FP16算力测试运行cuda-samples 本文记录了H800基础测试步骤及测试结果 参考链接 NVIDIA H100 Tensor Core GPU Architecture…

PotPlayer无边框配置指南,附送超好看皮肤与直播源!

提到PotPlayer,纯净无捆绑,支持超高清4K、蓝光HDR等,可实现无边框播放,自定义皮肤,直播源播放,alist播放,今天给大家分享下个人配置指南,大家可做参考,另外附送几十个皮肤…

【Redis】 分布式锁

1.分布式锁的工作原理 分布式锁是控制分布式系统间同步访问共享资源的一种方式,其可以保证共享资源在并发场景下的数据一致性。 为了达到同步访问,让这些线程在访问共享资源之前先要获取到一个令牌 token,只有具有令牌的线程才可以访问共享资…

嵩山是颍水的嵩山

颍水对于嵩山具有特别重要的意义,嵩山的水流大多数汇入了颍河,颍河流域约占登封市总面积88%,从这个角度讲,嵩山就是颍水的嵩山。 再看环嵩山地区,即“嵩山文化圈”,学者们按黄、淮、济分为三个水系区。黄河…

ROS2学习——节点话题通信(2)

目录 一、ROS2节点 1.概念 2.实例 (1)ros2 run (2)ros2 node list (3)remapping重映射 (4)ros2 node info 二、话题 (1) ros2 topic list &#xf…

Promise 的理解和使用

Promise 的理解和使用 Promise 是什么Promise 在使用上有哪些优势promise 的状态及值Promise 的工作流程如何使用 PromiseAPIPromise 的关键问题 Promise 是什么 抽象理解 Promise 是一门新的技术(ES6 规范)Promise 是 JS 中进行异步编程的新解决方案(旧方案是单纯…

【云原生】Kubeadm部署k8s

目录 一、部署步骤 二、部署kubernetes 2.1、所有节点关闭防火墙 核心防护 iptables规则 swap交换 2.2、修改主机名并添加主机映射 2.3、调整内核参数 三、安装Docker 3.1、所有节点安装docker 3.2、所有接点添加镜像加速器 3.3、开启docker、并设置开机自启、查看状态…

Java探秘:揭秘栈帧的神秘面纱与内存占用之谜

哈喽,大家好,我是木头左! 深入理解Java栈帧 在Java虚拟机(JVM)的运行时数据区中,每一个线程都有自己的栈(Stack),而栈中的每一个元素就是一个栈帧(Stack Frame)。当一个…

04信号量

如果有两个或者两个以上的任务(进程 / 线程,并发的实体),去访问一个共享资源(硬件上面的,软件上的)。我们必须要保证这个共享资源的有序访问,否则会产生不可预知的后果 例子: very_important_i 5; // 共享资源 fun(…

【BSP开发经验】用户态栈回溯技术

前言 在内核中有一个非常好用的函数dump_stack, 该函数在我们调试内核的过程中可以打印出函数调用关系,该函数可以帮助我们进行内核调试,以及让我们了解内核的调用关系。同时当内核发生崩溃的时候就会自己将自己的调用栈输出到串口。 栈回溯非常有利于我…

Java | Leetcode Java题解之第97题交错字符串

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isInterleave(String s1, String s2, String s3) {int n s1.length(), m s2.length(), t s3.length();if (n m ! t) {return false;}boolean[] f new boolean[m 1];f[0] true;for (int i 0; i <…

键盘盲打是练出来的

键盘盲打是练出来的&#xff0c;那该如何练习呢&#xff1f;很简单&#xff0c;看着屏幕提示跟着练。屏幕上哪里有提示呢&#xff1f;请看我的截屏&#xff1a; 截屏下方有8个带字母的方块按钮&#xff0c;这个就是提示&#xff0c;也就是我们常说的8个基准键位&#xff0c;我…

记录centos中操作(查找、结束、批量)进程以及crontab定时写法的知识

环境&#xff1a;vps&#xff0c;centos7&#xff0c;python3。 近期写了个python程序&#xff0c;用青龙面板在centos上运行。程序中有while无限循环&#xff0c;但是我在青龙中设置了定时任务&#xff08;每隔半小时运行一次&#xff09;&#xff0c;于是造成了进程中有多个…

Android hook禁止安装apk

支持的系统&#xff1a; Android 10、12、13 Hook进程&#xff1a; framework&#xff0c;在包名中表现为“android”。 实现&#xff1a; 添加一个黑名单列表&#xff1a; private val BLACK_LIST mutableListOf("com.tencent.mm",)Android 10 XposedBridge.ho…

如何在Sui智能合约中验证是否为多签地址

通过多签合约实现多个用户可访问的安全账户。多签&#xff08;multi-sig&#xff09;钱包和账户通过允许多个用户在预定义条件下访问共享资产&#xff0c;或让单个用户实施额外的安全措施&#xff0c;从而增强密钥管理。例如&#xff0c;多签钱包可以用于管理去中心化自治组织&…

纯代码如何实现WordPress搜索包含评论内容?

WordPress自带的搜索默认情况下是不包含评论内容的&#xff0c;不过有些WordPress网站评论内容比较多&#xff0c;而且也比较有用&#xff0c;所以想要让用户在搜索时也能够同时搜索到评论内容&#xff0c;那么应该怎么做呢&#xff1f; 网络上很多教程都是推荐安装SearchWP插…

海山数据库(He3DB)数据仓库发展历史与架构演进:(二)大数据数仓

从1990年代Bill Inmon提出数据仓库概念后经过四十多的发展&#xff0c;经历了早期的PC时代、互联网时代、移动互联网时代再到当前的云计算时代&#xff0c;但是数据仓库的构建目标基本没有变化&#xff0c;都是为了支持企业或者用户的决策分析&#xff0c;包括运营报表、企业营…

MySQL 存储过程返回更新前记录

在MySQL中&#xff0c;如果我们想在存储过程中返回更新前的记录&#xff0c;这通常不是直接支持的&#xff0c;因为UPDATE语句本身不返回更新前的数据。但是&#xff0c;我们可以通过一些策略来实现这个需求。 1.MySQL 存储过程返回更新前记录常用的方法策略 以下是一个常见的…