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,一经查实,立即删除!

相关文章

gin入门教程(2):go安装以及初始目录构建

2.1 安装 Go 1. 下载 Go 访问 Go 语言的官方网站 golang.org。根据您的操作系统(Windows、macOS 或 Linux)选择合适的安装包下载。 2. 安装 Go Windows: 运行下载的 .msi 安装程序,按照提示完成安装。 macOS: 可以…

洛谷题解 - P1162 填涂颜色

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

驱动开发系列20 - Linux Graphics Xorg-server 介绍

一: 概述 X.Org Server 是由 X.Org 基金会管理的 X Window System (X11) 显示服务器的自由开源实现。客户端 X Window System 协议的实现以 X11 库的形式存在,这些库作为与 X 服务器通信的有用 API。有两个主要的 X11 库。第一个库是 Xlib,它是最初的 C 语言 X11 API;…

python的散列类型与字符编码

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

如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

文章目录 一、什么是 HTTP?无状态的含义 二、为什么 HTTP 是无状态的?三、Cookie 和 Session 的引入1. Cookie特点:示例: 2. Session特点:示例(Java Servlet): 四、HTTP、Cookie 和 …

Appium中的api(一)

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

PostgreSQL的神秘面纱——pg_settings视图全解析

哈喽,大家好,我是木头左! 概述 PostgreSQL提供了丰富的配置选项,允许用户根据具体需求调整数据库的行为和性能。其中,pg_settings 视图是 PostgreSQL 提供的一个系统视图,用于显示和修改数据库的配置参数。本文将详细介绍 pg_settings 视图中的每个字段及其含义,帮助读…

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.第三问 首先&#…

GitLab CVE-2024-6389、CVE-2024-4472 漏洞解决方案

极狐GitLab 近日发布安全补丁版本17.3.2, 17.2.5, 17.1.7,修复了17个安全漏洞,本分分享其中两个漏洞 CVE-2024-6389、CVE-2024-4472 两个漏洞详情及解决方案。 极狐GitLab 正式推出面向 GitLab 老旧版本免费用户的专业升级服务,为 GitLab 老…

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

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

STM32Cube高效开发教程<高级篇><FreeRTOS>(九)-----信号量及二值量例程

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    本专栏博客参考《STM32Cube高效开发教程(高级篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。   本专栏在前…

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 存储库交互并利用语…

Python爬虫大详解,助你成为大佬

基础知识 Python基础:熟悉Python语言的基本语法,包括变量、数据类型(字符串、列表、字典等)、条件语句、循环、函数定义等 1. 变量 在Python中,变量不需要声明类型,直接赋值即可。 x 10 # 整数 …