在软件开发中,单例模式是一种常用的设计模式。它的作用是确保一个类只有一个实例,并且提供一个全局访问点。这种模式可以避免创建过多的对象,从而节省系统资源
单例模式适用于需要共享对象的场景。下面是一些适合使用单例模式的场景
普通实现
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>
上面就是几种实现单例的方式,其中用到来元类和装饰器,后面我们会介绍
欢迎关注,学习不迷路!