单例模式(singleton)- python实现

通俗示例

想象一下,一个国家只有一个国王。不管你在哪里,提到这个国家的国王,大家都能知道是指同一个人。在程序设计中,单例模式就像是这样的国王,一个类只有一个实例,无论你多少次请求这个类的实例,它总是返回同一个对象。

通俗解释

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这个模式通常用于管理共享资源,如数据库连接或文件系统的操作,其中重复的实例化可能会导致问题或不必要的性能开销。

单例模式的实现步骤

  1. 私有静态实例:单例类中有一个私有的静态变量,用来持有类的唯一实例。
  2. 私有构造函数 :单例类的构造函数是私有的,防止外部直接通过new关键字创建对象实例。
  3. 公有静态方法:提供一个公有的静态方法,用于获取单例类的实例。在这个方法中,会检查实例是否已经创建,如果尚未创建,则会创建实例。

Python代码示例

下面是一个简单的单例模式实现示例:

python 复制代码
"""
单例模式:
    确保一个类只有一个实例,并提供一个访问它的全局访问点。

    优点:
        1. 减少内存开销,避免重复创建对象
        2. 减少资源消耗,避免重复使用资源
        3. 避免对资源的多重占用,例如写文件、数据库连接等
        4. 优化程序结构,将多个对象组合成一个对象,可以简化对象之间的关系
        5. 优化程序性能,避免高并发下重复创建对象
"""


class Singleton:
    # 私有静态实例
    _instance = None

    # 私有构造函数
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance

    def __init__(self):
        self.count = 0

    # 公有方法
    def display(self):
        print(f"我是单例对象:{id(self)}")

    def get_value(self):
        return self.count

    def count_one(self):
        self.count += 1


# 客户端代码
if __name__ == "__main__":
    s1 = Singleton()
    print(s1.get_value())
    s2 = Singleton()

    s1.display()  # 输出: 我是单例对象:某个ID
    s2.display()  # 输出: 我是单例对象:同一个ID
    # 增加计数
    s1.count_one()
    # 对应s2也会增加
    print(s2.get_value())

在这个例子中,我们重写了__new__方法(这是Python中创建新实例的特殊方法),以确保每次尝试创建Singleton类的新实例时,都会返回同一个实例。

单例模式的变体

  • 懒汉式:实例在第一次使用时创建。
  • 饿汉式:实例在类加载时立即创建。

上面的例子是一个懒汉式的单例模式实现。在多线程环境下,懒汉式可能需要额外的同步措施来保证线程安全。

总结

单例模式适用于当你需要一个类来控制资源的访问,确保整个应用程序中只有一个实例被创建和使用。不过,过度使用单例模式可能会导致代码的不灵活和难以测试。因此,应当在确实需要时才使用这种模式。

相关推荐
小五1278 分钟前
数据科学与计算实例应用
开发语言·python
站大爷IP18 分钟前
Python类型注解:让代码“开口说话”的隐形助手
python
小马敲马37 分钟前
[4.2-2] NCCL新版本的register如何实现的?
开发语言·c++·人工智能·算法·性能优化·nccl
站大爷IP44 分钟前
Python多态实战:从基础到高阶的“魔法”应用指南
python
我们从未走散1 小时前
面试题-----微服务业务
java·开发语言·微服务·架构
码界筑梦坊1 小时前
108-基于Python的中国古诗词数据可视化分析系统
python·信息可视化·数据分析·django·毕业设计·numpy
歪歪1001 小时前
Vue原理与高级开发技巧详解
开发语言·前端·javascript·vue.js·前端框架·集成学习
紫金修道2 小时前
python安装部署rknn-toolkit2(ModuleNotFoundError: No module named ‘rknn_toolkit2‘)
开发语言·python
EndingCoder2 小时前
Next.js API 路由:构建后端端点
开发语言·前端·javascript·ecmascript·全栈·next.js·api路由