单例模式是一种常用的设计模式,它保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
单例模式是一种创建型模式,它保证一个类只有一个实例,并提供一个全局访问点。单例模式的核心在于控制类的实例数量,确保只有一个实例被创建并且全局可访问。
单例模式适用于以下场景:
Python中实现单例模式的方式有多种,这里介绍两种比较常用的方式。
1 2 3 4 5 6 7 8 9 | 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属性,这样下次再创建该类的实例时,就会直接返回该属性值,从而实现单例模式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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函数的引用,从而将该类转换为单例模式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # 基于__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