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

单例模式的变体

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

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

总结

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

相关推荐
李游Leo15 分钟前
JavaScript事件机制与性能优化:防抖 / 节流 / 事件委托 / Passive Event Listeners 全解析
开发语言·javascript·性能优化
JJJJ_iii1 小时前
【左程云算法09】栈的入门题目-最小栈
java·开发语言·数据结构·算法·时间复杂度
枫叶丹41 小时前
【Qt开发】显示类控件(三)-> QProgressBar
开发语言·qt
三体世界1 小时前
测试用例全解析:从入门到精通(1)
linux·c语言·c++·python·功能测试·测试用例·测试覆盖率
Python私教1 小时前
Django全栈班v1.04 Python基础语法 20250912 下午
后端·python·django
Bear on Toilet1 小时前
继承类模板:函数未在模板定义上下文中声明,只能通过实例化上下文中参数相关的查找找到
开发语言·javascript·c++·算法·继承
xchenhao1 小时前
Scikit-Learn 对糖尿病数据集(回归任务)进行全面分析
python·机器学习·回归·数据集·scikit-learn·特征·svm
xchenhao1 小时前
Scikit-learn 对加州房价数据集(回归任务)进行全面分析
python·决策树·机器学习·回归·数据集·scikit-learn·knn
这里有鱼汤1 小时前
发现一个高性能回测框架,Python + Rust,比 backtrader 快 250 倍?小团队必备!
后端·python
☼←安于亥时→❦1 小时前
数据分析之Pandas入门小结
python·pandas