什麼是單例模式,為什麼要用單例模式,怎麼實現單例模式?
只是我們今天要解決的三個問題。
首先,第一點,什麼是單例模式?
單例模式(singleton pattern)是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。
實現單例模式的三個要點:
單例模式的要點有三個;一是某個類只能有乙個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。
那麼單例模式的優缺點在哪?(為什麼要用)
優點:
一、例項控制
單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。
二、靈活性
因為類控制了例項化過程,所以類可以靈活更改例項化過程。
缺點:
一、開銷
雖然數量很少,但如果每次物件請求引用時都要檢查是否存在類的例項,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。
二、可能的開發混淆
使用單例物件(尤其在類庫中定義的物件)時,開發人員必須記住自己不能使用new關鍵字例項化物件。因為可能無法訪問庫源**,因此應用程式開發人員可能會意外發現自己無法直接例項化此類。
三、物件生存期
不能解決刪除單個物件的問題。在提供記憶體管理的語言中(例如基於.net framework的語言),只有單例類能夠導致例項被取消分配,因為它包含對該例項的私有引用。在某些語言中(如 c++),其他類可以刪除物件例項,但這樣會導致單例類中出現懸浮引用。
最後一點,如何實現單例模式:
第一種方法,也是最簡單的一種,使用模組來解決。
pyhton的模組就是天然的單例模式,因為模組的首次匯入時會生成.pyc檔案,當第二次匯入時,會直接執行.pyc
class singleton(object):
def foo(self):
pass
singleton = singleton()
將上面的**儲存在檔案mysingleton.py
中,要使用時,直接在其他檔案中匯入此檔案中的物件,這個物件即是單例模式的物件,每次使用時直接使用下面的語句匯入即可
from a import singleton
第二種方法;
使用裝飾器具體執行**如下:
def singleton(cls):
_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singleton
@singleton
class a(object):
a = 1
def __init__(self, x=0):
self.x = x
a1 = a(2)
a2 = a(3)
第三種方法;使用類:
class singleton(object):
def __init__(self):
pass
@classmethod
def instance(cls, *args, **kwargs):
if not hasattr(singleton, "_instance"):
singleton._instance = singleton(*args, **kwargs)
return singleton._instance
單例模式 Singleton 及其C 實現
保證乙個類只建立乙個例項。提供對該例項的全域性訪問點。如果系統有類似的實體 有且只有乙個,且需要全域性訪問 那麼就可以將其實現為乙個單例。實際工作中常見的應用舉例 首先看gof在描述單例模式時提出的一種實現,教科書式的例子,對c 有些經驗應該對該實現都有些印象 標頭檔案中 class singlet...
python實現單例模式
最近在寫乙個連線池,而連線池管理類不可避免的需要使用單例來保證所有使用者在取得連線時取到的一定是同乙個管理物件。故將此模式取來研究一番。保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點 設計模式 單例模式是全域性只有乙個訪問點,故對於乙個類來說,任何例項化後訪問到的都應該是同樣的物件。而也有另...
Python 實現單例模式
encoding utf 8 print 方法1 方法1,實現 new 方法 並在將乙個類的例項繫結到類變數 instance上,如果cls.instance為none說明該類還沒有例項化過,例項化該類,並返回 如果cls.instance不為none,直接返回cls.instance class ...