【精通Python单例模式】:高手进阶必读

前言

在软件开发中,单例模式是一种常用的设计模式。它的作用是确保一个类只有一个实例,并且提供一个全局访问点。这种模式可以避免创建过多的对象,从而节省系统资源

适用场景

单例模式适用于需要共享对象的场景。下面是一些适合使用单例模式的场景

  • 配置信息
    在一个程序中,通常需要读取一些配置信息,比如数据库连接信息、API密钥等。为了避免多次读取和解析配置文件,可以将配置信息存储在一个单例类中。这样,在程序运行时,只需要创建一个实例并共享它,就可以方便地访问配置信息。
  • 数据库连接池
    在一个多线程的程序中,通常需要使用数据库连接。为了避免创建过多的数据库连接,可以使用单例模式来创建一个全局的数据库连接池,并在需要时共享它
  • 计数器
    在一个并发程序中,通常需要计数器来统计某些事件的发生次数。为了避免竞争条件,可以使用单例模式来创建一个全局的计数器,并在需要时共享它

实现

普通实现

class Singleton:
    __instance = None  # 类属性,用于保存唯一的实例

    def __new__(self):
        if self.__instance is None:
            self.__instance = object.__new__(self)

        return self.__instance


s1 = Singleton()
s2 = Singleton()

print(s1)
print(s2)

执行结果

<__main__.Singleton object at 0x105149550>
<__main__.Singleton object at 0x105149550>

上面实现了单例,但是如果一个应用程序用到的单例类还挺多,那每个类都来这么操作一遍也比较麻烦,能不能规定一下类的创建规则,使用类改规则的类就是一个单例对象

元类方式解决

元类是一种特殊的Python类,它可以用来创建其他类。使用元类可以将一个类转换为单例模式,后面我们会介绍元类

class Singleton(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = object.__call__(*args, **kwargs)
        return cls._instances[cls]


class MyClass(metaclass=Singleton):
    pass


class MyClass2(metaclass=Singleton):
    pass


c1 = MyClass()
c2 = MyClass()
c3 = MyClass2()
c4 = MyClass2()

print(c1)
print(c2)
print(c3)
print(c4)

运行结果





 
  

装饰器方式
除了元类还可以使用装饰器模式来实现,后面会介绍装饰器模式,装饰器是一种Python语言特有的语法结构,它可以动态地修改类或函数的行为

def singleton(cls):
    instances = {}

    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return wrapper


@singleton
class MyClass:
    pass


@singleton
class MyClass2:
    pass


c1 = MyClass()
c2 = MyClass()
c3 = MyClass2()
c4 = MyClass2()

print(c1)
print(c2)
print(c3)
print(c4)

执行结果

<__main__.MyClass object at 0x103419fa0>
<__main__.MyClass object at 0x103419fa0>
<__main__.MyClass2 object at 0x103419cd0>
<__main__.MyClass2 object at 0x103419cd0>

上面就是几种实现单例的方式,其中用到来元类和装饰器,后面我们会介绍


欢迎关注,学习不迷路!

你可能感兴趣的:(python,python,单例模式,开发语言)