原文出處: 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...