首頁 >後端開發 >Python教學 >介紹Python的單例模式

介紹Python的單例模式

PHPz
PHPz原創
2017-04-02 13:26:481287瀏覽

匯流排是電腦各種功能部件或設備之間傳送資料、控制訊號等資訊的公共通訊解決方案之一。現假設有以下場景:某中央處理器(CPU)透過某種協議總線與一個信號燈相連,信號燈有64種顏色可以設置,中央處理器上運行著三個線程,都可以對這個信號燈進行控制,並且可獨立設定此信號燈的顏色。抽象掉協定細節(用列印表示),如何實作執行緒對訊號等的控制邏輯。
加上線程鎖進行控制,無疑是最先想到的方法,但各個線程對鎖的控制,無疑加大了模組之間的耦合。下面,我們就用設計模式中的單例模式,來解決這個問題。
什麼是單例模式?單例模式是指:保證一個類別只有一個實例,並提供一個存取它的全域存取點。具體到此例中,匯流排物件,就是一個單例,它只有一個實例,各個執行緒對匯流排的存取只有一個全域存取點,也就是惟一的實例。
Python程式碼如下:

#encoding=utf8import threading
import time#这里使用方法new来实现单例模式class Singleton(object):#抽象单例
    def new(cls, *args, **kw):        if not hasattr(cls, '_instance'):
            orig = super(Singleton, cls)
            cls._instance = orig.new(cls, *args, **kw)        return cls._instance#总线class Bus(Singleton):
    lock = threading.RLock()    def sendData(self,data):        self.lock.acquire()
        time.sleep(3)
        print "Sending Signal Data...",data        self.lock.release()#线程对象,为更加说明单例的含义,这里将Bus对象实例化写在了run里class VisitEntity(threading.Thread):
    my_bus=""
    name=""
    def getName(self):        return self.name    def setName(self, name):        self.name=name    def run(self):        self.my_bus=Bus()        self.my_bus.sendData(self.name)if  name=="main":    for i in range(3):
        print "Entity %d begin to run..."%i
        my_entity=VisitEntity()
        my_entity.setName("Entity_"+str(i))
        my_entity.start()

運行結果如下:
Entity 0 begin to run...
Entity 1 begin to run...
Entity 2 begin to run...
Sending Signal Data... Entity_0
Sending Signal Data... Entity_1
Sending Signal Data... Entity_2
在程式運作過程中,三個執行緒同時運行(運行結果的前三行先很快列印出來),而後分別佔用總線資源(後三行每隔3秒列印一行)。雖然看起來總線Bus被實例化了三次,但實際上在記憶體裡只有一個實例。

單例模式

單例模式是所有設計模式中比較簡單的一類,其定義如下:Ensure a class has only one instance, and provide a global point of access to it .(保證某一個類別只有一個實例,而且在全域只有一個存取點)

單例模式的優點和應用

單例模式的優點:
1、由於單範例模式要求在全域內只有一個實例,因而可以節省比較多的記憶體空間;
2、全域只有一個接入點,可以更好地進行資料同步控制,避免多重佔用;
3、單例可長駐內存,減少系統開銷。
單例模式的應用範例:
1、產生全域惟一的序號;
2、存取全域重複使用的惟一資源,如磁碟、匯流排等;
3、單一物件所佔用的資源過多,如資料庫等;
4、系統全域統一管理,如Windows下的Task Manager;
5、網站計數器。

單例模式的缺點

1、單例模式的擴展是比較困難的;
2、賦於了單例以太多的職責,某種程度上違反單一職責原則(六大原則後面會講到);
3、單例模式是並發協作軟體模組中需要最先完成的,因而其不利於測試;
4、單例模式在某種情況下會導致「資源瓶頸」。

以上是介紹Python的單例模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn