設計模式 單例模式

2021-09-05 09:53:55 字數 2563 閱讀 8053

乙個簡單方法就是將建構函式私有化,並建立乙個靜態方法來完成物件的初始化。意思就是當物件在第一次呼叫時被建立,此後這個類將返回同乙個物件。

python實現:(因為python無法建立私有的建構函式)

class  singleton(object):    # object 所有類都要繼承的乙個類,定義了各種魔法方法

def __new__(cls, *args, **kwargs): # cls表示類本身,self表示例項本身

if not hasattr(cls, 'instance'): # hasattr 用於判斷物件是否包含對應的屬性

cls.instance = super(singleton, cls).__new__(cls) # super 用來呼叫父類的乙個方法

return cls.instance

s = singleton()

print(s.instance)

s1 = singleton()

print(s1.instance)

<__main__.singleton object at 0x0729cd90>

<__main__.singleton object at 0x0729cd90>

當我們在匯入模組時,可能會無意中建立乙個物件,但當時根本用不到它,會造成一種資源的浪費,這時,懶漢式例項化就能夠解決這個問題,它能夠確保在實際需要時才建立物件。

python實現:

class singleton:

__instance = none

def __init__(self):

if not singleton.__instance:

print('__init__ method called')

else:

print('instance already created:', self.getinstance())

@classmethod

def getinstance(cls):

if not cls.__instance:

cls.__instance = singleton()

return cls.__instance

s = singleton()

print('object created', singleton.getinstance())

s1 = singleton()

__init__ method called

__init__ method called

object created <__main__.singleton object at 0x03693790>

instance already created: <__main__.singleton object at 0x03693790>

解釋:在執行s = singleton()的時候,它會呼叫__init__方法,但沒有新的物件被建立,然而,實際的物件建立發生在呼叫singleton.getinstance()的時候,通過這種方法來實現懶漢式例項化。

模組級別的單例模式:

在python中,當乙個模組被匯入時,它就會被初始化,然而,但同乙個模組被再次匯入時,它不會再次初始化,因為單例模式只能有乙個物件,所有,它會返回同乙個物件。

所有物件共享相同狀態

class borg:

__shared_state =

def __init__(self):

self.x = 1

self.__dict__ = self.__shared_state

pass

b = borg()

b1 = borg()

b.x = 4

print(borg().__dict__)

print(b, b.__dict__)

print(b1, b1.__dict__)

<__main__.borg object at 0x02dc31f0>

<__main__.borg object at 0x02dc3210>

解釋:將類變數__shared_state賦值給了變數__dict__,python使用__dict__儲存乙個類所有物件的狀態,在上面的**中,我們故意把__shared_state賦給所有已經建立的例項。所以,如果我們建立了兩個例項b,b1,我們將得到兩個不同的物件,這一點和單例模式大為不同,後者只能生成乙個物件。然而物件的狀態,即b.__dict__b1.__dict__卻是相同的,所以b的x發生了變化,這個變化也會賦值到被所以物件共享的__dict__變數,即b1的x也會變成4。

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...