標籤:python 單例模式 單例模式的優點
單例模式剛開始瞭解的時候我和我的小夥伴是兩臉懵逼的,後來也是經過查詢資料等等一系列瞭解後,一致認為這個要搞一搞。
單例模式的概述:Singleton模式要求一個類有且僅有一個執行個體,並且提供了一個全域的訪問點。這就提出了一個問題:如何繞過常規的構造器,提供一種機制來保證一個類只有一個執行個體?客戶程式在調用某一個類時,它是不會考慮這個類是否只能有一個執行個體等問題的,所以,這應該是類設計者的責任,而不是類使用者的責任。
從另一個角度來說,Singleton模式其實也是一種職責型模式。因為我們建立了一個對象,這個對象扮演了獨一無二的角色,在這個單獨的對象執行個體中,它集中了它所屬類的所有權力,同時它也肩負了行使這種權力的職責
優點
1、執行個體控制:Singleton 會阻止其他對象執行個體化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一執行個體
2、靈活性:因為類控制了執行個體化過程,所以類可以更加靈活修改執行個體化過程
3、在記憶體中只有一個對象,節省記憶體空間
4、避免頻繁的建立銷毀對象,可以提高效能,避免對共用資源的多重佔用,可以全域訪問。
缺點
1、開銷:雖然數量很少,但如果每次對象請求引用時都要檢查是否存在類的執行個體,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題,上面的五種實現方式中已經說過了。
2、可能的開發混淆:使用 singleton 對象(尤其在類庫中定義的對象)時,開發人員必須記住自己不能使用 new 關鍵字執行個體化對象。因為可能無法訪問庫原始碼,因此應用程式開發人員可能會意外發現自己無法直接執行個體化此類。
3、對象的生存期:Singleton 不能解決刪除單個對象的問題。在提供記憶體管理的語言中(例如基於 .NET Framework 的語言),只有 Singleton 類能夠導致執行個體被取消分配,因為它包含對該執行個體的私人引用。在某些語言中(如 C++),其他類可以刪除
對象執行個體,但這樣會導致 Singleton 類中出現懸浮引用。
適用性
l 當類只能有一個執行個體而且客戶可以從一個眾所周知的訪問點訪問它時。
l 當這個唯一執行個體應該是通過子類化可擴充的,並且客戶應該無需更改代碼就能使用一個擴充的執行個體時。
應用情境
l 每台電腦可以有若干個印表機,但只能有一個Printer Spooler,避免兩個列印工作同時輸出到印表機。
(摘自呂震宇的C#設計模式(7)-Singleton Pattern)
l PC機中可能有幾個串口,但只能有一個COM1口的執行個體。
l 系統中只能有一個視窗管理器。
l .NET Remoting中伺服器啟用物件中的Sigleton對象,確保所有的客戶程式的請求都只有一個執行個體來處理。
因為這個在一般面試中也是常常考到的,面試官可是讓你手寫的啊!能記住2個方法就記住2個方法:
1、使用__new__方法:
#方法1,實現__new__方法 #並在將一個類的執行個體綁定到類變數_instance上, #如果cls._instance為None說明該類還沒有執行個體化過,執行個體化該類,並返回 #如果cls._instance不為None,直接返回cls._instance class Singlenton(object): def __new__(cls,*args,**kwargs): if not hasattr(cls,‘instance‘): orig = super(Singleton,cls) cls.instance = orig.__new__(cls,*args,**kwargs) retrun cls.instance class MyClass1(Singleton): a = 1
2、共用屬性:
建立執行個體時把所有執行個體的__dict__指向同一個字典,這樣他們具有相同的屬相和方法。
#方法2,共用屬性;所謂單例就是所有引用(執行個體、對象)擁有相同的狀態(屬性)和行為(方法) #同一個類的所有執行個體天然擁有相同的行為(方法), #只需要保證同一個類的所有執行個體具有相同的狀態(屬性)即可 #所有執行個體共用屬性的最簡單最直接的方法就是__dict__屬性指向(引用)同一個字典(dict) #可參看:http://code.activestate.com/recipes/66531/class Borg(object): state = {} def __new__(cls,*args,**kwargs): ob = super(Borg,cls).__new__(cls,*args,**kwargs) ob.__dict__ = cls.state retrun obclass MyClass2(Borg): a = 1
本文出自 “路小瘋” 部落格,請務必保留此出處http://adonislxf.blog.51cto.com/11770740/1882239
python中讓人淡騰的單例模式