單例模式:
程式執行時只能生成乙個例項,避免對同一資源產生衝突的訪問請求。
django
admin.py下的admin.site.register() , site就是使用檔案匯入方式的單例模式
建立到單例模式4種方式:
1.檔案匯入
2. 類方式
3.基於__new__方式實現
4.基於metaclass方式實現
1.檔案匯入:
in single.py
class singleton():
def __init__(self):
pass
site = singleton()
類似: import time 第一次已經把匯入的time模組,放入記憶體
import time 第二次記憶體已有就不匯入了
from single.py import site #第一次匯入,例項化site物件並放入記憶體
in views.py
from single.py import site #第二次匯入,直接從記憶體拿。
2.類方式:
缺點:改變了單例的建立方式
obj = singleton.instance()
# 單例模式:無法支援多執行緒情況
import time
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 time
import threading
class singleton(object):
_instance_lock = threading.lock()
def __init__(self):
time.sleep(1)
@classmethod
def instance(cls, *args, **kwargs):
if not hasattr(singleton, "_instance"):
with singleton._instance_lock:
if not hasattr(singleton, "_instance"):
singleton._instance = singleton(*args, **kwargs)
return singleton._instance
3.
基於__new__方式實現:
單例建立方式:
obj1 = singleton()
obj2 = singleton()
import time
import threading
class singleton(object):
_instance_lock = threading.lock()
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if not hasattr(singleton, "_instance"):
with singleton._instance_lock:
if not hasattr(singleton, "_instance"):
singleton._instance = object.__new__(cls, *args, **kwargs)
return singleton._instance
4.
基於metaclass方式實現
基於metaclass方式實現的原理:
1.物件是類建立,建立物件時候類的__init__方法自動執行,物件()執行類的 __call__ 方法
2.類是type建立,建立類時候type的__init__方法自動執行,類() 執行type的 __call__方法
單例建立方式:
obj1 = foo()
obj2 = foo()
import threading
class singletontype(type):
_instance_lock = threading.lock()
def __call__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
with singletontype._instance_lock:
if not hasattr(cls, "_instance"):
cls._instance = super(singletontype,cls).__call__(*args, **kwargs)
return cls._instance
class foo(metaclass=singletontype):
def __init__(self):
pass
單例模式 單例模式
餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...
單例 單例模式
簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...
單例模式 懶漢式單例模式
單例模式有餓漢時模式和懶漢式 單例模式也就是說同一類只返回乙個物件供外部類使用 懶漢式即延遲初始化單例。在多執行緒環境下,簡單的懶漢式會有執行緒安全。懶漢式單例模式解決線性安全問題如下 1 使用雙重檢查鎖機制解決執行緒安全問題。2 單例模式還有更好的解決方案,即使用靜態類方式。懶漢式單例模式典型 p...