单例模式(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类的新实例时,都会返回同一个实例。

单例模式的变体

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

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

总结

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

相关推荐
三岁就很~酷~1 分钟前
ai开发 python+claudecode环境搭建
python·ai编程
赵钰老师2 分钟前
基于ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析
python·arcgis·数据分析·r语言
言乐626 分钟前
Python:用AES-GCM算法加密链接内容,并生成可分享的加密链接和解密工具
python·django·virtualenv·pygame·tornado
小静AI工程实验室35 分钟前
Claude Code 实用教程:Windows、macOS、Linux 从安装到项目调试与验收
人工智能·python·开发工具·claude code
beijixinghe39 分钟前
第15节 指针作为函数参数的工程实战用法
开发语言·c++·c++基础·c++入门·几何引擎c++
SEO_juper1 小时前
2026年用Python分析网站访问日志:看清Googlebot和AI爬虫怎么爬你的站(附完整代码)
开发语言·前端·seo·独立站·谷歌优化
OKkankan1 小时前
Python常用容器与导入语法详解(二)
数据结构·python
维基框架1 小时前
坊间传闻 OpenAI 将要发布GPT-6 Sol 模型
人工智能·pytorch·python
读研的武1 小时前
Python异步编程
python
宸津-代码粉碎机1 小时前
Java面试核心:JVM三大GC垃圾回收算法原理与生产场景落地分析
java·大数据·人工智能·python·spring