博主按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前採用
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);