單例模式(singleton pattern)屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立,並提供一種訪問其唯一物件的方式。
特點:1.單例類只能有乙個例項
2.單利類必須自己建立自己的唯一例項
3.單例類必須給其他物件提供這一例項
解決問題:
乙個全域性使用的類,頻繁的建立於銷毀。
使用場景:
需要控制例項數目,節省系統資源的時候。
建立方法:
判斷單例類當前是否存在例項,如果有則返回這個例項,沒有就建立
實際用法:
1.建立乙個物件需要消耗過多的資源,比如i/o與資料庫連線等
2.web中的計數器,不用每次重新整理都在資料庫裡加一次,先用單利快取起來
3.執行緒池的設計一般也才有單例模式,方便執行緒控制
4.應用程式的日誌應用,一般都何用單例模式實現,由於共享的日誌檔案一直處於開啟狀態,因為只能有乙個例項去操作,否則內容不好追加。
**實現:
1.使用模組
#1.使用模組:
"""python 的模組就是天然的單例模式,因為模組在第一次匯入時,會生成 .pyc 檔案,
當第二次匯入時,就會直接載入 .pyc 檔案,而不會再次執行模組**。
因此,我們只需把相關的函式和資料定義在乙個模組中,就可以獲得乙個單例物件了。
"""class
singleton(object):
deffoo(self):
pass
singleton =singleton()
#將上面的**儲存在檔案 mysingleton.py 中,要使用時,直接在其他檔案中匯入此檔案中的物件,這個物件即是單例模式的物件
#from mysingleton import singleton
2.使用元類metaclass
#2.使用元類metaclass
"""1.類由type建立,建立類時,type的__init__方法自動執行,類例項化,執行type的 __call__方法
2.物件由類建立,建立物件時,類的__init__方法自動執行,物件()執行類的 __call__ 方法
"""class
singleton(type):
"""在元類singleton的__call__方法對類屬性__instance進行判斷,如果__instance為none,
說明類還未進行例項化,那麼呼叫元類的父類(元類是type的子類)type的__call__方法,
同時賦值給 cls.__instance。如果 cls.__instance 不為none,
說明類已經進行過例項化,直接返回之前儲存在類屬性cls.__instance 中的類例項,即實現單例模式。
"""def
__init__(cls, *args, **kwargs):
cls.
__instance =none
super().
__init__(*args, **kwargs)
def__call__(cls, *args, **kwargs):
ifnot cls.__instance
: cls.
__instance = super().__call__(*args, **kwargs)
return cls.__instance
class foo(metaclass=singleton):
pass
foo1 =foo()
foo2 =foo()
print(foo1 is foo2)
3.使用__new__方法
#3.使用__new__方法
class
singleton(object):
"""當我們例項化乙個物件時,是先執行了類的__new__方法(我們沒寫時,預設呼叫object.__new__),
例項化物件,然後再執行類的__init__方法,對這個物件進行初始化,
所有我們可以基於這個,實現單例模式
"""def
__new__(cls, *args, **kwargs):
ifnot hasattr(cls, '
_instance
'): #
關鍵在於每一次例項化,我們都返回這同乙個_instance物件
cls._instance = super().__new__
(cls)
return
cls._instance
class
foo(singleton):
def__init__
(self):
pass
foo1 =foo()
foo2 =foo()
print(foo2 is foo1)
4.使用裝飾器
#4.使用裝飾器
defsingleton(cls):
instance ={}
def get_singleton(*args, **kwargs):
if cls not
in instance: #
判斷是否存在字典中
instance[cls] = cls(*args, **kwargs) #
這裡相當於foo()
return
instance[cls]
return
get_singleton
@singleton
class
foo:
pass
foo1 =foo()
foo2 =foo()
print(foo1 is foo2)
程式設計模式 單例模式
由於例項化是在初始化階段執行的,所以沒有執行緒安全的問題,但是潛在問題在於no local static物件 函式外的static物件 在不同編譯單元 可理解為cpp檔案和其包含的標頭檔案 中的初始化順序是未定義的。如果在初始化完成之前呼叫 instance 方法會返回乙個未定義的例項。例如有兩個單...
python單例模式繼承 python單例模式
我們可以使用 new 這個特殊方法。該方法可以建立乙個其所在類的子類的物件。更可喜的是,我們的內建 object 基類實現了 new 方法,所以我們只需讓 sing 類繼承 object 類,就可以利用 object 的 new 方法來建立 sing 物件了。classsing object def...
單例模式 python
單例模式 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。實現 某個類只有乙個例項 途徑 1 讓乙個全域性變數使得乙個物件被訪問,但是它不能防止外部例項化多個物件。2 讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立。即單例模式。多執行緒時的單例模式 加鎖 雙重鎖定。餓漢式...