单例模式
Python中的单例模式
一、单例模式的概述
单例模式是一种常用的软件设计模式,通俗来说就是希望在系统中某个类的对象只能存在一个。主要有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
二、单例模式优缺点
优点:
- 实例控制:单例模式会阻止其他对象实例化其终极的单例对象的副本,从而确保所有的对象都访问唯一实例
- 灵活性:因为类控制了实例化过程,所以类可以实力更改实例化过程
缺点:
- 开销:虽然数量小,但是如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销
- 可能的开发混淆:使用单例对象(尤其是类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象
- 对象生成期:不能解决删除单个对象的问题,在提供内存管理的语言中,只有单例类能够导致单例类出现悬浮引用。
三、单例类的实现方式
- 实现__new__方法
class Singleton:
__instance = None
__is_init = True
def __new__(cls, *args, **kwargs):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
def __init__(self, name):
if Singleton.__is_init is False:
Singleton.__is_init = True
self.name = name
class MyClass(Singleton):
a=1
解析:
实现__new__方法,然后将类的一个实例绑定到类变量__instance上,如果cls.__instance为None,则该实例没有被实例化过。
- 使用metaclass的用法
class Singleton:
def __init__(self, name, bases, dict):
super(Singleton, self).__init__(name, bases, dict)
self._instance = None
def __call__(self, *args, **kwargs):
if self._instance is None:
self._instance = super(Singleton, self).__call__(*args, **kwargs)
return self._instance
class MyClass(object, metaclass=Singleton):
a = 1
解析:
class Singleton中的__init__在Myclass声明的时候被执行Myclass=Singleton(),Myclass()执行时,最先执行父类的__call__方法,根据深度优先算法,会执行Singleton中的__call__方法。
- 装饰器
class Singleton:
__instance = None
__is_init = True
def __new__(cls, *args, **kwargs):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
def __init__(self, name):
if Singleton.__is_init is False:
Singleton.__is_init = True
self.name = name
@singleton
class MyClass(Singleton):
a=1