一。單例模式的作用
單件模式經常被用來管理資源敏感的對象,比如:數據庫連接對象、註冊表對象、線程池對象等等,這種對象如果同時存在多個的話就會造成各種不一致的麻煩(你總不希望發生數據庫重複連接的異常吧)
引自 黯羽輕揚:設計模式之單件模式(Singleton Pattern)
此外,單例模式還可以用來減少內存開銷(保證巨大對象只有一個)
二。最簡單的單例模式
var singleton = {
// attr: val
}
嗯,就這麼簡單。singleton 指向的對象是唯一的,無法通過其它方式創建這樣一個對象(深拷貝不算,因為拷貝的前提是已經存在一個這樣的對象)。比起構造函數方式實現的單例,對象字面量有着天然的優勢——它是「一次性」的
這種單例存在強依賴(緊耦合)的缺點,依賴關係被限制在對象字面量中,甚至都沒有辦法在初始化時傳參(單例本身是一個功能完整的對象(模塊),如果無法在初始化時傳參,勢必會影響其功能)
三。一般單例模式
可以結合模塊模式來修復上面的問題,例如:
var singleton = (function() {
var obj; // 單例的引用
function init() {
// 私有屬性
// var attr = val
return {
// 公有屬性
// attr: val
}
}
return {
getInstance: function() {
if (!obj) {
obj = init();
}
return obj;
}
}
})();
// 使用
var mySingleton = singleton.getInstance();
// mySingleton.xxx
singleton.getInstance() 就是全局訪問入口,從這個入口拿到的對象都是同一個。如果不需要延遲初始化,就不需要提供 getInstance 接口了,直接返回單例對象即可。當然,在大多數時候,單例模式意味着巨大對象,延遲初始化是很必要的
四。JavaScript 中單例模式的作用
瀏覽器環境中的 JS 是單線程的,不需要管理臨界資源,而且也不存在資源敏感的大對象(數據庫連接對象、註冊表對象、線程池對象等等)。這樣看來,JS 中單例模式好像沒什麼用。
事實確實是這樣,JS 中單例模式唯一的用途可能就是管理巨大對象了,避免同時存在多個巨大對象的內存消耗,比如 jQuery 這樣的頂級命名空間,以及各級子命名空間,用單例模式來管理可以避免混亂
參考資料
-
《JavaScript 設計模式》
暫無評論,快來發表你的看法吧