單例模式 單例模式的定義是:保證一個類只有一個實例,並提供一個訪問它的全局訪問點。比如說購物車,在一個商城中,我們只需要一個購物車,購物車在整個商城中是唯一的,不需要多次創建,即使多次點擊購物車按鈕,也不會生成多個購物車。 閉包預警:有對閉包不明白的同學,可以 "看這裡" 。 讓我們實現一個單例模式 ...
單例模式
單例模式的定義是:保證一個類只有一個實例,並提供一個訪問它的全局訪問點。比如說購物車,在一個商城中,我們只需要一個購物車,購物車在整個商城中是唯一的,不需要多次創建,即使多次點擊購物車按鈕,也不會生成多個購物車。
閉包預警:有對閉包不明白的同學,可以看這裡。
讓我們實現一個單例模式吧
var Singleton = function(name) {
this.name = name;
}
Singleton.getInstance = (function () {
var instance = null;
return function (name) {
if (!instance) {
instance = new Singleton(name);
}
return instance;
}
})()
var single1 = Singleton.getInstance('張三');
var single2 = Singleton.getInstance('李四');
console.log(single1 === single2); // 輸出true
我們主要看一下Singleton.getInstance
方法,其中將變數instance
作為一個標誌,來確認是否創建過Singleton
對象。如果沒有就創建一個Singleton
對象,反之則返回之前創建過的對象。
這樣我們創建Singleton
對象的時候,就得使用Singleton.getInstance
方法,而不是使用new
關鍵字來創建對象。如果想使用new
關鍵字的話,可以這樣寫。
使用代理類來實現單例模式
var Singleton = function(name) {
this.name = name;
}
var ProxySingleton = (function () {
var instance = null;
return function(name) {
if (!instance) {
instance = new Singleton(name);
}
return instance;
}
})()
var single1 = new ProxySingleton('張三');
var single2 = new ProxySingleton('李四');
console.log(single1 === single2); // 輸出true
我們將管理單例的邏輯放入ProxySingleton
這個代理類中,從而使Singleton
變成一個普通的類或者構造函數。這樣我們就可以通過new
關鍵字來創建對象。
創建對象和管理單例邏輯職責分離
var createObj = function(name, age) {
return {
name: name,
age: age
}
}
var getSingle = function(fn) {
var instance = null;
return function () {
return instance || (instance = fn.apply(this, arguments));
}
}
var CreateFn = getSingle(createObj);
var obj1 = CreateFn('張三', 18);
var obj2 = CreateFn('李四', 19);
console.log(obj1 === obj2); // 輸出true
這裡createObj
方法負責創建對象和處理內部邏輯,getSingle
方法只負責管理單例的邏輯。這樣在創建各種單例對象的情況下,使用更加靈活。也符合單一職責的開發原則。
單例模式的使用場景
單例模式的使用場景非常廣泛,這裡舉幾個