Flask 單例模式

2021-08-14 13:25:31 字數 2737 閱讀 6361

單例模式:

程式執行時只能生成乙個例項,避免對同一資源產生衝突的訪問請求。

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...