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

单例模式的变体

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

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

总结

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

相关推荐
Voyager_421 分钟前
图像处理踩坑:浮点数误差导致的缩放尺寸异常与解决办法
数据结构·图像处理·人工智能·python·算法
jie*24 分钟前
小杰深度学习(ten)——视觉-经典神经网络——LetNet
人工智能·python·深度学习·神经网络·计算机网络·数据分析
大叔_爱编程32 分钟前
基于Python的交通数据分析应用-hadoop+django
hadoop·python·django·毕业设计·源码·课程设计·交通数据分析
Blossom.1181 小时前
用一颗MCU跑通7B大模型:RISC-V+SRAM极致量化实战
人工智能·python·单片机·嵌入式硬件·opencv·机器学习·risc-v
235161 小时前
【并发编程】详解volatile
java·开发语言·jvm·分布式·后端·并发编程·原理
工业互联网专业1 小时前
基于大数据的学习资源推送系统的设计与实现 _django
vue.js·python·django·毕业设计·源码·课程设计·学习资源推送系统
Algebraaaaa2 小时前
Qt中的字符串宏 | 编译期检查和运行期检查 | Qt信号与槽connect写法
开发语言·c++·qt
Red Car2 小时前
javascript 性能优化实例一则
开发语言·javascript·ecmascript
友友马2 小时前
『 QT 』Hello World控件实现指南
开发语言·qt
一只学java的小汉堡2 小时前
Java 面试高频题:HashMap 与 ConcurrentHashMap 深度解析(含 JDK1.8 优化与线程安全原理)
java·开发语言·面试