1. 程式人生 > >python設計模式之一-單例模式

python設計模式之一-單例模式

引言

在面向物件的世界裡,物件是對客觀事物的抽象,類是對物件的抽象。它們之間的關係是,物件是類的例項,類是物件的模板。

這段文字表述起來費勁,理解起來也費勁,還是講生活中的例子吧。比如說“大河”,一聯想到這個詞,不同的人腦海中的印象是不一樣的,有的是“大漠孤煙直,長河落日圓”,有的是“春江潮水連海平,海上明月共潮生”,有的是“星垂平野闊,月湧大江流”。在這個例子中,大河可以認為是一個類,大河具有所有河流的共性特徵,如有河堤,有長度,會流向大海等特性,而幾句詩中的“石羊河”、“瀏陽河”、“長江”等分別是大河的一個例項化物件。

在大河的例子中,一個大河類可以有多個不同的例項。可是,我們今天的主角-單例模式,應用單例模式的類卻只能有一個例項。

比如我們常見的作業系統的工作管理員,它就是一個單例模式的實現。

定義

單例模式(singleton pattern):確保一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。
這個定義有三個要點

  1. 某個類只能有一個例項
  2. 類應當自行建立這個例項
  3. 它必須向整個系統提供這個例項

UML結構

singleton uml
角色:單例本身

優缺點

優點
  1. 應用單例模式例項化類在應用程式域中只存在一個物件,滿足業務需要的同時,無疑也能降低記憶體消耗,提高計算機效能。
  2. 由於例項化的過程由類本身完成,可方便地選擇例項時機。
缺點
  1. 由於單例模式通常為單一類且不允許繼承,所以它的擴充套件能力受限。
  2. 由於上一點的原因,單例類通常承載了過多的職能,違反了單一職責原則。

例項

Lilei和Hanmeimei經過多年的愛情長跑,終於邁入婚姻的殿堂。婚後不久,就有了愛情的結晶,小朋友名叫LittleMango。

class SingletonBase(type):
    def __init__(self,*args,**kwargs):
        self._instance=None
        super().__init__(*args,**kwargs)
    def __call__(self,*args,**kwargs):
        if self._instance is None:
            self._instance=super(SingletonBase,self).__call__(*args,**kwargs)
        return self._instance
    
class LittleMango(metaclass=SingletonBase):
    def show_my_age(self):
        print('I\'m 5 years old')
        
if __name__ == "__main__":
    s1=LittleMango()
    s2=LittleMango()
    print('s1:',id(s1))
    print('s2:',id(s2))
    
s1: 800311678008
s2: 800311678008

通過上面的例項,我們看見s1和s2引用了同一個記憶體地址,這樣,我們就實現了單例模式。在專案應用中,如果把SingletonBase封裝起來,需要實現單例模式的地方繼承此類即可。

原文連結