目錄
1、使用裝飾器實現
2、使用__new__方法實現
單例模式是一種設計模式,它確保一個類只有一個實例,并提供一個全局訪問點來訪問這個唯一實例。這種模式在多種場景中都非常有用,以下是單例模式的一些常見應用場景:
- 應用程序的日志應用:日志記錄通常需要一個全局共享的日志對象,以便于追加日志內容。使用單例模式可以確保在整個應用程序中只有一個日志對象實例。
- 數據庫連接池:數據庫連接是昂貴的資源,頻繁地創建和銷毀連接會導致性能問題。通過單例模式,可以確保數據庫連接池只有一個實例,從而有效地管理和復用數據庫連接。
- 多線程的線程池:線程池用于管理和復用線程,以避免頻繁地創建和銷毀線程。使用單例模式可以確保線程池只有一個實例,從而方便地對池中的線程進行控制和管理。
- 全局配置對象:在Web應用中,配置對象通常是共享的,需要確保在整個應用程序中只有一個實例。使用單例模式可以方便地讀取和更新全局配置對象。
1、使用裝飾器實現
def singleton(cls):instances = {}def get_instance(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return get_instance@singleton
class MyClass:def __init__(self, val):self.val = val# 使用
a = MyClass(1)
b = MyClass(2)
print(a is b) # 輸出:True
2、使用__new__方法實現
通過重寫類的?__new__
?方法,可以控制實例的創建。
class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = super(Singleton, cls).__new__(cls)return cls._instanceclass MyClass(Singleton):def __init__(self, val):self.val = val# 使用
a = MyClass(1)
b = MyClass(2)
print(a is b) # 輸出:True
在這個例子中,Singleton
?類是一個基類,它確保所有繼承自它的類都是單例的。