本节目录
保证一个类只有一个实例,并提供一个访问它的全局访问点
单例,即只有一个类的实例
当类只有一个实例而且客户可以从一个众所周知的访问点访问它时
比如:数据库链接、Socket创建链接
对唯一实例的受控访问
对唯一实例的受控访问
单利相当于全局变量,但防止了命名空间被污染
与单利模式功能相似的概念:全局变量、静态变量(方法)
试问?为什么用单例模式,不用全局变量呢?
答、全局变量可能会有名称空间的干扰,如果有重名的可能会被覆盖
s1.py
class Foo(object):
def test(self):
print("123")
v = Foo()
#v是Foo的实例
s2.py
from s1 import v as v1
print(v1,id(v1)) # 35788560
from s1 import v as v2
print(v1,id(v2)) # 35788560
## 两个的内存地址是一样的
## 文件加载的时候,第一次导入后,再次导入时不会再重新加载。
复制代码## **********************单例模式:无法支持多线程情况**************=
class Singleton(object):
def __init__(self):
import time
time.sleep(1)
@classmethod
def instance(cls, *args, **kwargs):
if not hasattr(Singleton, "_instance"):
Singleton._instance = Singleton(*args, **kwargs)
return Singleton._instance
import threading
def task(arg):
obj = Singleton.instance()
print(obj)
for i in range(10):
t = threading.Thread(target=task,args=[i,])
t.start()
## ********************单例模式:支持多线程情况****************、
import time
import threading
class Singleton(object):
_instance_lock = threading.Lock()
def __init__(self):
<