筆記-程序設計-單例模式
筆記-程序設計-單例模式
1. 單例模式
單例模式(singleton pattern)是一種常用軟件設計模式,該模式主要目的是確保某一個類只有一個實例存在。
下面幾種方法的原理都是類似的,就是在導入/創建時判斷是否唯一。
2. python實現單例模式
2.1. 模塊方式
模塊只會在第一次導入時加載,就是單例模式。
因此,只需要把相關函數和數據定義在一個模塊中,就可以獲得一個單例類。
# singleton module
class Singleton(object):
def foo(self):
pass
singleton = Singleton()
將上面的代碼保存到mysingleton.py中,要使用時,直接導入這個對象。
from mysingleton import singleton
2.2. 使用裝飾器
使用裝飾器修飾類,在裝飾器函數中維護一個字典對象,該字典緩存了所有單例類,在實例化類時裝飾器進行判斷,如果該類已存在則S
# decoration singleton
def Singleton(cls):
_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singleton
@Singleton
class A(object):
a = 1
def __init__(self, x=0):
self.x = x
a1 = A(2)
a2 = A(3)
print(‘a1.a=%d, a1.x=%d; a2.a=%d, a2.x=%d‘%(a1.a, a1.x, a2.a, a2.x))
2.3. 使用__new__()
# singleton __new__()
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
class Myclass(Singleton):
a = 1
a1 = Myclass()
a2 = Myclass()
print(a1 == a2, a1 is a2)
2.4. 使用元類
# singleton metaclass
class Singleton(type):
print(‘www‘)
def __call__(cls, *args, **kwargs):
if not hasattr(cls, ‘_instance‘):
print(cls)
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance
class MyClass(metaclass=Singleton):
a = 4
a1 = MyClass()
a2 = MyClass()
print(a1 == a2) #True
筆記-程序設計-單例模式