单例模式(Singleton)
一、单例模式
1、相关知识:
内容:保证一个类只有一个实例,并提供一个访问它的全局访问点;其保证了在程序的不同位置都可以且仅可以取到同一个对象实例。
使用场景:当类只能有一个实例而且用户从多个地方访问同一个类的实例。
举个例子来说: 比如你开发一款游戏软件,游戏中需要有“场景管理器”这样一种东西,用来管理游戏场景的切换、资源载入、网络连接等等任务。这个管理器需要有多种方法和属性,在代码中很多地方会被调用,且被调用的必须是同一个管理器,否则既容易产生冲突,也会浪费资源。这种情况下,单例模式就是一个很好的实现方法。
例如:
Python的logger就是一个单例模式,用以日志记录;
Windows的资源管理器是一个单例模式;
线程池,数据库连接池等资源池一般也用单例模式;
网站计数器;
优点:
1、只有一个实例占用资源,并且只需初始化一次;
2、对唯一实例的受控访问;
2、实现方式:
(1)、使用函数装饰器实现单例:
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
@singleton
class Cls(object):
def __init__(self):
pass
cls1 = Cls()
cls2 = Cls()
print(id(cls1) == id(cls2))
# 输出结果:
True
(2)、使用类装饰器实现单例:
class Singleton(object):
def __init__(self, cls):
self._cls = cls
self._instance = {}
def __call__(self):
if self._cls not in self._instance:
self._instance[self._cls] = self._cls()
return self._instance[self._cls]
@Singleton
class Cls2(object):
def __init__(self):
pass
cls1 = Cls2()
cls2 = Cls2()
print(id(cls1) == id(cls2))
# 输出结果:
True
(3)、使用 new 关键字实现单例模式:
class Single(object):
_instance = None
def __new__(cls, *args, **kw):
if cls._instance is None:
cls._instance = object.__new__(cls, *args, **kw)
return cls._instance
def __init__(self):
pass
single1 = Single()
single2 = Single()
print(id(single1) == id(single2))
# 输出结果:
True
(4)、使用 metaclass 实现单例模式:
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class Cls4(metaclass=Singleton):
pass
cls1 = Cls4()
cls2 = Cls4()
print(id(cls1) == id(cls2))
# 输出结果:
True
原文地址:https://blog.csdn.net/xiangzun0155/article/details/143803543
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!