Python 建立單例模式的三種方式

2021-08-23 14:24:58 字數 1299 閱讀 7657

原文出處: liuzhijun

裝飾器維護乙個字典物件instances,快取了所有單例類,只要單例不存在則建立,已經存在直接返回該例項物件。

python

def singleton(cls):

instances = {}

if cls not in instances:

instances[cls] = cls(*args, **kwargs)

return instances[cls]

@singleton

class foo(object):

pass

foo1 = foo()

foo2 = foo()

print foo1 is foo2

__new__是真正建立例項物件的方法,所以重寫基類的__new__方法,以此來保證建立物件的時候只生成乙個例項

python

class singleton(object):

def __new__(cls, *args, **kwargs):

if not hasattr(cls, '_instance'):

cls._instance = super(singleton, cls).__new__(cls, *args, **kwargs)

return cls._instance

class foo(singleton):

pass

foo1 = foo()

foo2 = foo()

print foo1 is foo2  # true

元類(參考:深刻理解python中的元類)是用於建立類物件的類,類物件建立例項物件時一定會呼叫__call__方法,因此在呼叫__call__時候保證始終只建立乙個例項即可,type是python中的乙個元類。

python

class singleton(type):

def __call__(cls, *args, **kwargs):

if not hasattr(cls, '_instance'):

cls._instance = super(singleton, cls).__call__(*args, **kwargs)

return cls._instance

class foo(object):

__metaclass__ = singleton

foo1 = foo()

foo2 = foo()

print foo1 is foo2  # true

單例模式建立的三種方式

一 單例模式的好處 1.對於頻繁使用的物件,可以省略new操作花費的時間,這對於那些重量級物件而言,是非常可觀的一筆系統開銷 2.由於new操作的次數減少,因而對系統記憶體的使用頻率也會降低,這將減輕gc壓力,縮短gc停頓時間。二 建立方式 1 餓漢式 1 public class singleto...

單例模式的三種寫法

這裡介紹三種單例模式寫法。第一種 餓漢模式 類載入時就初始化 public class singletonhungry public static singletonhungry getinstance 第二種 懶漢模式 類載入時不初始化,當呼叫getinstance方法時初始化 public cl...

單例模式的三種實現

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