python中讓人淡騰的單例模式

來源:互聯網
上載者:User

標籤: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中讓人淡騰的單例模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.