博主按: "《每天一個設計模式》" 旨在初步領會設計模式的精髓,目前採用 (_靠這吃飯_)和 (_純粹喜歡_)兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :) 1. 網速過慢的朋友請移步 "《每天一個設計模式之單例模式》原文地址" 2. 歡迎來我的小站看更多 ...
博主按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前採用
javascript
(靠這吃飯)和python
(純粹喜歡)兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :)
- 網速過慢的朋友請移步《每天一個設計模式之單例模式》原文地址
- 歡迎來我的小站看更多乾貨 + 免費教程:godbmw.com
0. 項目地址
1. 什麼是單例模式?
單例模式定義:保證一個類僅有一個實例,並提供訪問此實例的全局訪問點。
2. 單例模式用途
如果一個類負責連接資料庫的線程池、日誌記錄邏輯等等,此時需要單例模式來保證對象不被重覆創建,以達到降低開銷的目的。
3. 代碼實現
需要指明的是,以下實現的單例模式均為“惰性單例”:只有在用戶需要的時候才會創建對象實例。
3.1 python3 實現
class Singleton:
# 將實例作為靜態變數
__instance = None
@staticmethod
def get_instance():
if Singleton.__instance == None:
# 如果沒有初始化實例,則調用初始化函數
# 為Singleton生成 instance 實例
Singleton()
return Singleton.__instance
def __init__(self):
if Singleton.__instance != None:
raise Exception("請通過get_instance()獲得實例")
else:
# 為Singleton生成 instance 實例
Singleton.__instance = self
if __name__ == "__main__":
s1 = Singleton.get_instance()
s2 = Singleton.get_instance()
# 查看記憶體地址是否相同
print(id(s1) == id(s2))
3.2 javascript 實現
const Singleton = function() {};
Singleton.getInstance = (function() {
// 由於es6沒有靜態類型,故閉包: 函數外部無法訪問 instance
let instance = null;
return function() {
// 檢查是否存在實例
if (!instance) {
instance = new Singleton();
}
return instance;
};
})();
let s1 = Singleton.getInstance();
let s2 = Singleton.getInstance();
console.log(s1 === s2);