跳到主要內容
黯羽輕揚每天積累一點點

單例模式_JavaScript 設計模式 3

免費2015-07-14#JS#Design_Pattern#JavaScript设计模式#JavaScript单例模式#Singleton_Pattern

Singleton(單例)模式在 JS 中實現起來非常簡單,如果不考慮依賴注入,用對象字面量方式創建的對象就是單例,本文詳細介紹 JS 中的單例模式

一。單例模式的作用

單件模式經常被用來管理資源敏感的對象,比如:數據庫連接對象、註冊表對象、線程池對象等等,這種對象如果同時存在多個的話就會造成各種不一致的麻煩(你總不希望發生數據庫重複連接的異常吧)

引自 黯羽輕揚:設計模式之單件模式(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 這樣的頂級命名空間,以及各級子命名空間,用單例模式來管理可以避免混亂

參考資料

評論

暫無評論,快來發表你的看法吧

提交評論