1. 程式人生 > >筆記-程序設計-單例模式

筆記-程序設計-單例模式

cal 修飾 單例類 n) ali per -a not in __new__

筆記-程序設計-單例模式

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

筆記-程序設計-單例模式