9. 单例模式

什么是单例模式

单例模式(Singleton Pattern)是在整个应用程序内部,在同一时刻只允许有一个实例对象存在的模式。

单例模式其核心思想是确保一个类只有一个实例对象,并提供一个全局访问点来访问该对象。

例如:

现实世界中,地球就是一个单例;你在某一家银行的账户也是一个单例。

这种模式常用于需要严格控制资源或共享状态的场景,例如数据库连接池、线程池、日志记录器等。

Python语言实现单例模式的方法

示例

先看一下不是单例的情况:

# 单例模式 示例

class Singleton:
    """单例的实现方法!"""
    def __init__(self, *args):
        print("开始对单例对象进行初始化")

obj1 = Singleton()
print(obj1)
obj2 = Singleton()
print(obj2)
print(obj1 is obj2)

运行结果

开始对单例对象进行初始化
<__main__.Singleton object at 0x10ee96e40>
开始对单例对象进行初始化
<__main__.Singleton object at 0x10efd0cd0>
False

两个对象 obj1 和 obj2 的 id 不同,不是单例

使用 重写 __new__ 方法,实现单例模式

# 单例模式 示例

class Singleton:
    """单例的实现方法!"""
    __instance = None  # 用来绑定唯一的对象。

    def __new__(cls, *args, **kwargs):
        "用来创建一个对象;如果已经创建过了,那么将不再创建此类的对象,直接返回已前创建过的对象。"
        if cls.__instance is None:
            print('开始创建单例对象!')
            cls.__instance = object.__new__(cls, *args, **kwargs)  # 没有创建过此对象,则调用父类的__new__创建
        return cls.__instance

    def __init__(self, *args):
        print("开始对单例对象进行初始化")

obj1 = Singleton()
print(obj1)
obj2 = Singleton()
print(obj2)
print(obj1 is obj2)

运行结果

开始创建单例对象!
开始对单例对象进行初始化
<__main__.Singleton object at 0x10d406f90>
开始对单例对象进行初始化
<__main__.Singleton object at 0x10d406f90>
True

两个对象 obj1 和 obj2 的 id 相同,都是同一个对象。是单例模式。