python常用设计模式,单例模式和工厂设计模式

python常用设计模式,单例和工厂设计模式Demo

单例模式

单例设计模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。

应用场景:日志记录、线程池、缓存等

优点:

  • 全局访问:提供了一个全局访问点,便于控制实例数量。
  • 资源节约:避免了创建多个对象时的资源浪费。
  • 线程安全:在多线程环境中,可以保证只创建一个实例。
  • 控制实例化:可以控制对象的创建过程。

缺点:

  • 代码耦合:单例模式可能会隐藏一些依赖关系,导致代码耦合。
  • 可测试性差:由于单例模式是全局的,这使得单元测试变得困难。
  • 内存浪费:单例对象在程序的整个生命周期内都占用内存。
  • 滥用:单例模式有时会被滥用,导致程序设计不灵活

方法一:使用模块的全局变量
Python模块是天然的单例,实现单例模式
singleton_module.py

class Singleton:  def __init__(self):  self.value = None  singleton_instance = Singleton()

在其他地方使用这个单例:

from singleton_module import singleton_instance  
# 使用单例  
singleton_instance.value = 42  
print(singleton_instance.value)  

在这里插入图片描述
方法二:使用类变量
通过类变量来跟踪实例,并在实例化时进行检查

class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)return cls._instancedef __init__(self):if not hasattr(self, 'initialized'):  # 确保只初始化一次  self.value = Noneself.initialized = True# 使用单例  
singleton1 = Singleton()
singleton2 = Singleton()singleton1.value = 42
print(singleton2.value)  # 输出: 42  
print(singleton1 is singleton2)  # 输出: True

在这里插入图片描述
方法三:使用装饰器
通过装饰器来实现单例模式

def singleton(cls):  instances = {}  def get_instance(*args, **kwargs):  if cls not in instances:  instances[cls] = cls(*args, **kwargs)  return instances[cls]  return get_instance  @singleton  
class Singleton:  def __init__(self):  self.value = None  # 使用单例  
singleton1 = Singleton()  
singleton2 = Singleton()  singleton1.value = 42  
print(singleton2.value)  # 输出: 42  
print(singleton1 is singleton2)  # 输出: True

方法四:使用元类(Metaclass)

class SingletonMeta(type):  _instances = {}  def __call__(cls, *args, **kwargs):  if cls not in cls._instances:  cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)  return cls._instances[cls]  class Singleton(metaclass=SingletonMeta):  def __init__(self):  self.value = None  # 使用单例  
singleton1 = Singleton()  
singleton2 = Singleton()  singleton1.value = 42  
print(singleton2.value)  # 输出: 42  
print(singleton1 is singleton2)  # 输出: True

最常用和推荐的方法是使用类变量(方法二)和元类(方法四),因为它们在语义上更加清晰和直观

工厂设计模式

定义一个创建对象的接口,让子类决定实例化哪个类

优点:

  • 代码解耦:将对象的创建与使用分离,使得代码更加灵活,易于扩展。
  • 提高可维护性:当需要添加新的产品时,只需要添加一个具体的产品类和相应的具体工厂类即可,无需修改已有的工厂类。
  • 封装性:隐藏了对象创建的细节,调用者只需要知道类型,不需要知道具体的实现。

缺点:

  • 每增加一个产品类别,都需要增加一个产品类和一个工厂类,这可能导致类的数量成倍增加。
  • 系统的抽象程度变得更高,对于简单的情况,可能会增加系统的复杂性。

代码样例:

"""例如,可以使用工厂函数或抽象基类(Abstract Base Classes, ABCs)来实现工厂模式"""
from abc import ABC, abstractmethod
class Animal(ABC):@abstractmethoddef sound(self):pass
class Dog(Animal):def sound(self):return "Woof! "
class Cat(Animal):def sound(self):return "Meow! "
class AnimalFactory:@staticmethoddef get_animal(animal_type):if animal_type == "dog":return Dog()elif animal_type == "cat":return Cat()else:raise ValueError("Invalid animal type")# 使用工厂模式
factory = AnimalFactory()
dog = factory.create_animal("dog")
cat = factory.create_animal("cat")
print(dog.sound())  # 输出 "Woof!"
print(cat.sound())  # 输出 "Meow!"

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

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

相关文章

洛谷题解 - P1162 填涂颜色

目录 填涂颜色题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解思路代码 填涂颜色 题目描述 由数字 0 0 0 组成的方阵中,有一任意形状的由数字 1 1 1 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 2 2 2。例如: 6 6 6\times…

python的散列类型与字符编码

文章目录 一、 初识散列类型(无序序列)二、认识集合集合的方法增删 二、认识字典字典方法增删改查 声明空变量 三、字符编码元组名() #声明一个空元组 一、 初识散列类型(无序序列) 数据类型分为3种: python的序列类型有好几种,之前的博文讲到了两种类型 1.数值类型…

Appium中的api(一)

目录 1.基础python代码准备 1--参数的一些说明 2--python内所要编写的代码 解释 2.如何获取包名和界面名 1-api 2-完整代码 代码解释 3.如何关闭驱动连接 4.安装卸载app 1--卸载 2--安装 5.判断app是否安装 6.将应用放到后台在切换为前台的时间 7.UIAutomatorViewer的使用 1--找…

Oracle CONNECT BY、PRIOR和START WITH关键字详解

Oracle CONNECT BY、PRIOR和START WITH关键字详解 1. 基本概念2. 数据示例3. SQL示例3.1. 查询所有员工及其上级3.2. 显示层次结构3.3. 查询特定员工的子级 4. 结论 在Oracle数据库中,CONNECT BY、PRIOR和START WITH关键字主要用于处理层次结构数据,例如…

5、JavaScript(四) ajax+js高级+BOM

25.ajax : 前端向后端异步的取数据而无需刷新页面的技术 1 公司中的整体工作流程 1、项目开发的流程 每个职位该做的工作: 产品经理:提需求的 与客户沟通 画出原型图给程序员使用 UI设计师:美化 替换UI框架:antd element-ui e…

sql-labs靶场第十六关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①寻找注入方法 ②爆库,查看数据库名称 ③爆表,查看security库的所有表 ④爆列,查看users表的所有列 ⑤成功获取用户名…

学习--四元数介绍

2022年的草稿箱里的一篇 四元数由William Rowan Hamilton发现 定义与复数类似,有三个虚部 q a b i c j d k qabicjdk qabicjdk 其中 i 2 j 2 k 2 i j k − 1 i^2j^2k^2ijk-1 i2j2k2ijk−1 四元数的模长: 四维的长度 加减法: 对应分…

linux-牛刀小试

题目一: 1.第一问 首先创建用户tab在超级用户root的终端输入useradd tab 切换到tab用户: 推出重新登录到tab用户或者su – tab切换到tab用户 2.第二问 在桌面创建SHEGNCHAN目录 在SHENGCHAN文件夹下创建相应的文件: 3.第三问 首先&#…

笔记本使用虚拟机,使用Ubuntu打开摄像头

最近在搞ros相关的内容,亲测了一下虚拟机Ubuntu打开摄像头,也是需要简单的设置的。 只需要 简单设置这四步 目录 设置usb3.1打开摄像头查看摄像头显示摄像头内容 设置usb3.1 这一步是为了防止打开摄像头的时候,没有画面。 打开摄像头 选…

V4L2驱动框架

文章目录 一、V4L2简介二、v4l2驱动关键组件(一)video_device结构体v4l2操作方法结构体v4l2的ioctl操作方法结构体 (二)v4l2_device结构体 一、V4L2简介 V4L2,即Video for Linux two,是Linux内核中用于视频…

Linux Redis查询key与移除日常操作

维护老项目Express node 编写的后端程序、有这么一个方法、没有设置redis过期时间(建议设置过期时间,毕竟登录生产服务器并不是每个人都有权限登录的!!!)。如果变动只能通过登录生产服务器、手动修改… 于…

本地docker部署中间件和应用

Docker Desktop搭建 安装完成之后使用docker下载镜像,报以下错误: 解决办法: Docker Engine配置能访问的镜像地址: {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled…

使用 Elasticsearch 作为向量数据库询问有关你的 GitHub 存储库的问题

作者:来自 Elastic Fram Souza 本博客介绍了使用 RAG 和 Elasticsearch 实现语义代码查询的 GitHub Assistant,提供对 GitHub 存储库的洞察,并可扩展到 PR 反馈、问题处理和生产准备情况审查。 该项目允许你直接与 GitHub 存储库交互并利用语…

【YOLOv11】制作使用YOLOv11的docker环境

目录 一 安装docker 1 安装依赖 2 添加docker官网 GPG 密钥、设置stable 仓库 3 安装 4 使用 二 环境制作 ① 拉基础镜像 ② 起容器 ③ 安装Anaconda3 ④ 安装YOLO11 ⑤ /root/.bashrc ⑥ 退出容器 ⑦ 保存镜像 ⑧ 镜像的使用 一 安装docker ubuntu:20.04 1 安装…

Java项目-基于springboot框架的人职匹配推荐系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

【LeetCode】每日一题 2024_10_24 找到连续赢 K 场比赛的第一位玩家(模拟/脑筋急转弯)

前言 每天和你一起刷 LeetCode 每日一题~ 1024 程序员节快乐~ LeetCode 启动! 题目:找到连续赢 K 场比赛的第一位玩家 代码与解题思路 题目让我们从第一个元素开始让数组中的元素排队一个个打擂台,直到找到最先赢下 k 次的元素编号 因为…

代码随想录算法训练营第六天|454四数相加II、 383赎金信、15三数之和、18四数之和

day06 1. 454四数相加II 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。定义int变量count,用来统计 …

系统性能优化的终极武器,一键让你的电脑焕发第二春

作为Windows系统维护的得力助手,PC Fresh为用户带来全方位的电脑优化解决方案。这款智能系统工具采用先进的检测引擎,不仅能够实时监控计算机的运行状态,更可以精准定位影响性能的潜在问题。通过智能诊断技术,软件会针对每台电脑的…

多去尝试 AI 产品经理面试,你会意外发现……

前言 这两天跟很多做程序员的朋友聊天,怎么看全网火爆的大模型。让我挺意外的是,大家的反馈普遍都很焦虑 。 在AI大模型微调领域的产品经理面试中,总会遇到一系列与技术细节、项目经验、市场趋势以及职业规划相关的问题。以下是一些建议的面…

GEE引擎传奇UI界面修改教程

还记得小林之前给大家分享了gom引擎UI界面编辑教程,今天给大家分享一下gee引擎UI界面修改教程 首先打开登录器生成器-客户端界面设置 在客户端界面设置这里可以自定义UI素材,也可以直接在原素材上编辑主界面 传奇根目录指向的是你的传奇客户端根目录&am…