单例模式是一种常用的设计模式,它保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
单例模式是一种创建型模式,它保证一个类只有一个实例,并提供一个全局访问点。单例模式的核心在于控制类的实例数量,确保只有一个实例被创建并且全局可访问。
单例模式适用于以下场景:
Python中实现单例模式的方式有多种,这里介绍两种比较常用的方式。
class Singleton(object): def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = super(Singleton, cls).__new__(cls) return cls.instance s1 = Singleton() s2 = Singleton() print(s1 == s2) # True
在这种实现方式中,我们通过重写类的__new__方法来实现单例模式。在__new__方法中,我们首先判断该类是否已经创建了实例,如果没有则调用父类的__new__方法创建实例,然后将该实例赋值给类的instance属性,这样下次再创建该类的实例时,就会直接返回该属性值,从而实现单例模式。
def singleton(cls): instances = {} def get_instance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return get_instance @singleton class MyClass(object): pass m1 = MyClass() m2 = MyClass() print(m1 == m2) # True
在这种实现方式中,我们通过定义一个装饰器函数来实现单例模式。在该装饰器函数中,我们定义了一个内部函数get_instance来获取实例,并使用一个字典来保存不同类的实例。在调用装饰器函数时,我们将需要实现单例模式的类作为参数传入,然后返回get_instance函数的引用,从而将该类转换为单例模式。
# 基于__new__方法的单例模式实现方式 class Singleton(object): def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = super(Singleton, cls).__new__(cls) return cls.instance s1 = Singleton() s2 = Singleton() print(s1 == s2) # True # 基于装饰器的单例模式实现方式 def singleton(cls): instances = {} def get_instance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return get_instance @singleton class MyClass(object): pass m1 = MyClass() m2 = MyClass() print(m1 == m2) # True
通过上面的代码案例,我们可以看到两种不同的单例模式实现方式,并且在使用时都可以保证只有一个实例被创建,这样可以避免多次创建对象导致的资源浪费。
本文为翻滚的胖子原创文章,转载无需和我联系,但请注明来自猿教程iskeys.com