乙個簡單方法就是將建構函式私有化,並建立乙個靜態方法來完成物件的初始化。意思就是當物件在第一次呼叫時被建立,此後這個類將返回同乙個物件。
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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...