python實現單例模式的三種方法

2021-10-02 07:22:32 字數 1709 閱讀 9913

單例模式就是一種建立型模式,可以讓類有且只有乙個物件,並提供全域性訪問,每次例項化物件都是返回的同乙個物件,並且屬性和方法都是相同的,指向位址也是相同的。

1.第一種方法:使用裝飾器

def

singleton

(cls)

: instances =

def(

*args,

**kwargs)

:if cls not

in intances:

instances[cls]

= cls(

*args,

**kwargs)

return instances[cls]

@singleton

class

foo(

object):

pass

foo1 = foo(

)foo2 = foo(

)print

(foo1 = foo2)

# true

2.第二種方法:使用基類new是真正建立例項物件的方法,所以重寫基類的new方法,以此保證建立物件的時候只生成乙個例項。
class

singleton

(object):

def__new__

(cls,

*args,

**kwargs):if

nothasattr

(cls,

*args,

**kwargs)

: cls._instance =

super

(singleton,cls)

.__new__(cls,

*args,

**kwargs)

reeturn cls._instance

class

foo(singleton)

:pass

foo1 = foo(

)foo2 = foo(

)print

(foo1 is foo2)

# true

3.第三種方法:元類,元類是用於建立物件的類,類物件建立例項物件時一定要呼叫的call方法,因此在呼叫call方法時候保證始終只建立乙個例項即可,type是python的元類。
class

singleton

(type):

def__call__

(cls,

*args,

**kwargs):if

nothasattr

(cls,

'_instance'):

cls._instance =

super

(singleton,cls)

.__call__(

*args,

**kwargs)

return cls._instance

# python2

class

foo(

object):

__metaclass__ = singleton

#python3

class

foo(metaclass = singleton)

:pass

foo1 = foo(

)foo2 = foo(

)print

(foo1 is foo2)

# true

單例模式的三種實現

class singleton public static singleton getinstance 缺點 類每次使用時都會初始化靜態成員變數 呼叫該類的其它方法時也會初始化 浪費記憶體。class singleton public static singleton getinstance ret...

c 三種單例模式實現

因為在設計或開發中,肯定會有這麼一種情況,乙個類只能有乙個物件被建立,如果有多個物件的話,可能會導致狀態的混亂和不一致。這種情況下,單例模式是最恰當的解決辦法。它有很多種實現方式,各自的特性不相同,使用的情形也不相同。今天要實現的是常用的三種,分別是餓漢式 懶漢式和多執行緒式。通過單例模式,可以做到...

單例模式的三種實現方法

在實際開發中,我們往往需要乙個類只能被例項化一次,如果有多個物件的話,就會導致混亂情況發生。優點 一 例項控制 單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。二 靈活性 因為類控制了例項化過程,所以類可以靈活更改例項化過程。一 開銷 雖然數量很少,但如果每次物件...