单例模式(Singleton)

单例模式是最常被提及、也最容易被误用的设计模式之一。
在 Python 中,由于语言特性特殊,单例模式既简单,也容易踩坑

本篇我们重点解决三个问题:

  1. 单例模式到底解决什么问题
  2. Python 中有哪些实现方式
  3. 哪些场景真的适合用单例

一、什么是单例模式

单例模式(Singleton) 的定义很简单:

保证一个类在系统中只有一个实例,并提供全局访问点。

核心目标只有两个:

  • 控制实例数量:只能有一个
  • 提供统一访问入口

二、为什么需要单例模式

在实际项目中,以下对象往往只需要一个实例:

  • 配置中心
  • 日志对象
  • 数据库连接池
  • 缓存管理器
  • 全局状态管理器

如果这些对象被反复创建,可能带来:

  • 资源浪费
  • 状态不一致
  • 隐蔽的逻辑 Bug

三、最“Python 风格”的单例:模块即单例

在 Python 中,模块天然是单例的

# config.py
class Config:
    DEBUG = True
# main.py
from config import Config

解释:

  • 模块只会被加载一次
  • 多次 import 返回的是同一个模块对象

推荐指数:★★★★★
如果能用模块解决,不要写复杂单例代码


四、基于 __new__ 的经典单例实现

当你必须使用类时,最常见的是重写 __new__

class Singleton:
    _instance = None

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

测试:

a = Singleton()
b = Singleton()
print(a is b)  # True

特点:

  • 控制实例创建过程
  • 逻辑清晰,易理解
  • 是讲解单例原理的最佳示例

五、线程安全的单例(加锁版)

在多线程环境中,上面的实现并不安全

import threading

class Singleton:
    _instance = None
    _lock = threading.Lock()

    def __new__(cls):
        if cls._instance is None:
            with cls._lock:
                if cls._instance is None:
                    cls._instance = super().__new__(cls)
        return cls._instance

适用场景:

  • 多线程程序
  • Web 服务
  • 后台任务系统






次阅读

扫描下方二维码,关注公众号:程序进阶之路,实时获取更多优质文章推送。


扫码关注

评论