基于Python实现单例模式

目录

1、使用装饰器实现

2、使用__new__方法实现

单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。这种模式在多种场景中都非常有用,以下是单例模式的一些常见应用场景:

  1. 应用程序的日志应用:日志记录通常需要一个全局共享的日志对象,以便于追加日志内容。使用单例模式可以确保在整个应用程序中只有一个日志对象实例。
  2. 数据库连接池:数据库连接是昂贵的资源,频繁地创建和销毁连接会导致性能问题。通过单例模式,可以确保数据库连接池只有一个实例,从而有效地管理和复用数据库连接。
  3. 多线程的线程池:线程池用于管理和复用线程,以避免频繁地创建和销毁线程。使用单例模式可以确保线程池只有一个实例,从而方便地对池中的线程进行控制和管理。
  4. 全局配置对象:在Web应用中,配置对象通常是共享的,需要确保在整个应用程序中只有一个实例。使用单例模式可以方便地读取和更新全局配置对象。

1、使用装饰器实现

python 复制代码
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 MyClass:
    def __init__(self, val):
        self.val = val


# 使用
a = MyClass(1)
b = MyClass(2)
print(a is b)  # 输出:True

2、使用__new__方法实现

通过重写类的 __new__ 方法,可以控制实例的创建。

python 复制代码
class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance


class MyClass(Singleton):
    def __init__(self, val):
        self.val = val


# 使用
a = MyClass(1)
b = MyClass(2)
print(a is b)  # 输出:True

在这个例子中,Singleton 类是一个基类,它确保所有继承自它的类都是单例的。

相关推荐
一眼万里*e几秒前
搭建个人知识库
python
程序员小远40 分钟前
软件测试之bug分析定位技巧
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·bug
江上清风山间明月1 小时前
Android 系统中进程和线程的区别
android·python·线程·进程
mit6.8241 小时前
[LivePortrait] docs | Gradio用户界面
python
听风吟丶2 小时前
Java 函数式编程深度实战:从 Lambda 到 Stream API 的工程化落地
开发语言·python
饮长安千年月3 小时前
玄机-第八章 内存马分析-java03-fastjson
开发语言·python·安全·web安全·网络安全·应急响应
天天爱吃肉82183 小时前
新能源汽车动力系统在环(HIL)半实物仿真测试台架深度解析
人工智能·python·嵌入式硬件·汽车
卡次卡次13 小时前
注意点:挂载与插硬盘,容器挂载实现持久化存储
python
2401_841495643 小时前
【LeetCode刷题】找到字符串中所有字母异位词
数据结构·python·算法·leetcode·数组·滑动窗口·找到字符串中所有字母异位词
MediaTea4 小时前
Python 第三方库:OpenPyXL(Excel 文件读写与操作)
开发语言·python·excel