目錄
什么是單例模式
能解決什么問題
使用場景
如何實現
__new__ 方法:經典又直接
裝飾器:不改類本身,也能單例
模塊本身就是單例
注意事項
總結
?
????????你有沒有過這樣的困擾:
“為什么我明明只創建了一次數據庫連接,程序卻悄悄多了好幾個?資源占滿了,性能還慢了。”
????????在軟件世界里,有些東西,真的只需要一個就夠了。這就是單例模式的世界。
什么是單例模式
????????單例模式(Singleton Pattern),本質上就是 保證某個類全局只有一個實例,無論你嘗試創建多少次,得到的都是同一個對象。
????????形象一點:想象你家只有一臺冰箱。無論家里多少人去開門、取東西,冰箱都是那一臺,不會莫名其妙多出一個新冰箱。
能解決什么問題
- 統一管理資源:比如數據庫連接,創建一次就夠,避免重復占用資源
- 全局狀態共享:日志記錄器、配置文件、緩存對象…每個模塊都能訪問同一個實例
- 保證程序穩定性:避免多對象操作同一個資源導致混亂
????????簡單說,單例模式讓你的程序有序而高效,就像冰箱里的食物再多,也不會亂成一團。
使用場景
- 數據庫連接:你不想每次操作都重新連接數據庫
- 日志系統:程序里每個模塊都能統一寫入日志
- 配置管理:整個程序共享一個配置對象,方便修改與讀取
- 緩存對象:統一存儲數據,避免重復計算
????????換句話說,當“唯一性”是關鍵時,單例就登場了。
如何實現
__new__ 方法:經典又直接
class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = super().__new__(cls)return cls._instancea = Singleton()
b = Singleton()
print(a is b) # True
- 核心理念:對象創建之前先檢查“冰箱”是否存在
- 如果存在,就直接拿來用;不存在,才創建一個
裝飾器:不改類本身,也能單例
def singleton(cls):instances = {}def wrapper(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return wrapper@singleton
class MyClass:passa = MyClass()
b = MyClass()
print(a is b) # True
- 想象:裝飾器就像一個“守門員”,保證每個類的“冰箱”只出現一次
- 優點:無需修改類本身,易復用
模塊本身就是單例
# singleton_module.py
class MySingleton:passinstance = MySingleton()
# main.py
from singleton_module import instancea = instance
b = instance
print(a is b) # True
- 特點:Python 模塊天然單例
- 想象一下,模塊就像整個城市的唯一冰箱,大家都能直接去用
注意事項
- 線程安全:多線程環境可能同時創建多個實例,需要加鎖保護
- 不要濫用:單例是工具,不是全局變量的萬能替代
- 繼承問題:子類可能打破單例,需要特別處理
總結
單例模式就像 程序里的冰箱:
- 獨一無二:全局只有一個實例
- 高效共享:避免重復資源浪費
- 有序管理:讓全局狀態清晰可控
????????下次當你遇到“必須保證唯一”的場景,想想冰箱,單例模式就自然而然地閃現在腦海里。