一、单例模式
单例模式,实现一个类,并且保证这个类的多次实例化操作,都会只生成同一个实例对象。
二、应用场景
整个系统中只需要存在一个实例对象,其他对象都可以通过访问该对象来获取信息,比如:
- 系统的配置信息对象
- 日志对象
- 数据库操作对象
- 线程池对象
三、编码示例
1.单线程中的单例模式
方式一、重载类构造器
定义:
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = object.__new__(cls, *args, **kwargs)
return cls._instance
使用:
if __name__ == '__main__':
instance1 = Singleton()
instance2 = Singleton()
instance3 = Singleton()
# 打印出 3 个实例对象的内存地址,判断是否相同。
print(id(instance1))
print(id(instance2))
print(id(instance3))
方式二、实现单例装饰器
定义:
def singleton(cls):
_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singleton
使用:
@singleton
class Singleton(object):
"""单例实例"""
def __init__(self, arg1):
self.arg1 = arg1
if __name__ == '__main__':
instance1 = Singleton("xag")
instance2 = Singleton("xingag")
print(id(instance1))
print(id(instance2))
2.多线程中的单例模式
方式三、重载具有线程锁的类构造器
多线程中的单例模式,需要在__new__
构造器中使用threading.Lock()
同步锁。
定义:
class Singleton(object):
_instance = None
_instance_lock = threading.Lock()
def __new__(cls, *args, **kwargs):
if cls._instance is None:
with cls._instance_lock:
cls._instance = object.__new__(cls, *args, **kwargs)
return cls._instance
使用:
def task(arg):
instance = Singleton()
print(id(instance), '\n')
if __name__ == '__main__':
for i in range(3):
t = threading.Thread(target=task, args=[i, ])
t.start()
到此这篇关于Python 设计模式创建型单例模式的文章就介绍到这了,更多相关Python 单例模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!