一、内容
保证一个类只有一个实例,并提供一个访问它的全局访问点
二、角色
单利
三、使用场景
当类只有一个实例而且客户可以从一个众所周知的访问点访问它时
比如:数据库链接、Socket创建链接
四、优点
对唯一实例的受控访问
单利相当于全局变量,但防止了命名空间被污染
与单利模式功能相似的概念:全局变量、静态变量(方法)
试问?为什么用单例模式,不用全局变量呢?
答、全局变量可能会有名称空间的干扰,如果有重名的可能会被覆盖
五、单例模式的四种实现方式
1、文件导入的形式(常用)
s1.pyclassFoo(object):deftest(self):print("123")
v=Foo()#v是Foo的实例
s2.pyfrom s1 importv as v1print(v1,id(v1)) # 35788560
from s1 importv as v2print(v1,id(v2)) # 35788560
#两个的内存地址是一样的#文件加载的时候,第一次导入后,再次导入时不会再重新加载。
2、基于类实现的单例模式
#======================单例模式:无法支持多线程情况===============
classSingleton(object):def __init__(self):importtime
time.sleep(1)
@classmethoddef instance(cls, *args, **kwargs):if not hasattr(Singleton, "_instance"):
Singleton._instance= Singleton(*args, **kwargs)returnSingleton._instanceimportthreadingdeftask(arg):
obj=Singleton.instance()print(obj)for i in range(10):
t= threading.Thread(target=task,args=[i,])
t.start()#====================单例模式:支持多线程情况================、
importtimeimportthreadingclassSingleton(object):
_instance_lock=threading.Lock()def __init__