概念
單例模式: 只有一個實例存在铣焊。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問逊朽,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)的資源。
基本結構
原始型:最簡單的單例模式其實就是一個對象字面量曲伊。
var singleton = {
prop: "value",
method: function () {
}
}
這種形式的單例模式叽讳,所有成員都是公開的,都可以通過singleton來訪問坟募。這樣的缺點是:單例中有一些輔助方法并不希望暴露給使用者岛蚤,如果使用者用了這些方法,然后在后面維護的時候婿屹,一些輔助方法被刪除,這樣會造成程序的錯誤推溃。
包含私有成員的單例模式
var singleton = (function () {
var privateVar = "private";
return {
prop: "value",
method: function () {
console.log(privateVar);
}
}
})();
首先是一個自執(zhí)行的匿名函數(shù)昂利,在匿名函數(shù)中届腐,聲明了一個變量privateVar,返回一個對象賦值給單例對象singleton蜂奸。在匿名函數(shù)外部無法訪問到privateVar變量犁苏,它就是單例對象的私有變量,只能在函數(shù)內部或通過暴露出來的方法去訪問這個私有變量扩所。這種形式又被成為模塊模式围详。
惰性實例化
不管是直接字面量或者私有成員的單例模式,兩者都是在腳本加載時就被創(chuàng)建出來的單例祖屏,但是有時候助赞,頁面可能永遠也用不到這個單例對象,這樣會造成資源浪費袁勺。對于這種情況雹食,最佳的處理方式就是惰性加載,就是說在需要的時候才去真正實例化這個單例對象期丰,如何實現(xiàn)呢群叶?
var singleton = (function () {
function init() {
var privateVar = "private";
return {
prop: "value",
method: function () {
console.log(privateVar);
}
}
}
var instance = null;
return {
getInstance: function () {
if (!instance) {
instance = init();
}
return instance;
}
}
})();
首先將創(chuàng)建單例對象的代碼封裝到init函數(shù)中,然后聲明一個私有變量instance表示單例對象的實例钝荡,公開一個方法getInstance來獲取單例對象街立。
調用的時候就通過singleton.getInstance()來進行調用,單例對象是在調用getInstance的時候才真正被創(chuàng)建埠通。
總結
單例模式的好處在于對代碼的組織作用赎离,將相關的屬性和方法封裝在一個不會被多次實例化的對象中,讓代碼的維護和調試更加輕松植阴。隱藏了實現(xiàn)細節(jié)蟹瘾,可以防止被錯誤修改,還防止了全局命名空間的污染掠手。另外可以通過惰性加載提高性能憾朴,減少不必要的內存消耗。