模式定義
單例模式: 確保一個類只有一個例項, 並且提供一個全域性訪問的方法, 屬於建立型模式。
模式結構圖
程式碼實現
- 懶漢模式
1. 懶漢模式中單例是在需要的時候才去建立的,如果單例已經建立,再次呼叫獲取介面將不會重新建立新的物件,而是直接返回之前建立的物件。
2. 如果某個單例使用的次數少,並且建立單例消耗的資源較多,那麼就需要實現單例的按需建立
複製程式碼
namespace SingletonPattern {
export class Singleton {
private static singleton: Singleton;
private constructor () {
}
public static getInstance () {
if (Singleton.singleton === null) {
Singleton.singleton = new Singleton();
}
return Singleton.singleton;
}
}
}
複製程式碼
測試程式碼:
/// <reference path="Singleton.ts" />
var s1 = SingletonPattern.Singleton.getInstance();
var s2 = SingletonPattern.Singleton.getInstance();
if (s1 === s2) {
console.log('兩個例項相等');
}
else {
console.log('兩個例項不等');
}
複製程式碼
- 餓漢模式
1. 餓漢模式在類載入的時候就對例項進行建立,例項在整個程式週期都存在。
2. 它的好處是隻在類載入的時候建立一次例項, 適合單例佔用記憶體比較小,在初始化時就會被用到的情況
3. 它的缺點也很明顯,即使這個單例沒有用到也會被建立,而且在類載入之後就被建立,記憶體就被浪費了
複製程式碼
namespace SingletonPattern {
export class Singleton {
private static singleton: Singleton = new Singleton;
private constructor () {
}
public static getInstance () {
return Singleton.singleton;
}
}
}
複製程式碼
測試程式碼不變。
關於名稱空間這裡大致解釋下:
ts的名稱空間可以把程式碼包裹起來,通過export關鍵字進行對外暴露被訪問的物件。
在名稱空間外部需要通過"完全限定名"來訪問暴露的物件。
通過reference註釋引用名稱空間,即可通過“完全限定名”進行訪問。
相同的名稱空間可以宣告在不同的檔案中。
複製程式碼
模式分析
單例模式的目的: 確保只有一個類的例項出現, 並提供一個全域性訪問的方法。
組成:
- 私有構造方法, 確保使用者無法通過new來建立例項
- 靜態私有成員變數singleton儲存唯一的例項
- 靜態公有方法getInstance(): 靜態例項的存在性並例項化
複製程式碼
優點
- 提供了對唯一例項的受控訪問
缺點
- 由於單例模式中沒有抽象層, 不易擴充套件
- 單例類的職責過重,在一定程度上違背了“單一職責原則”。因為單例類既充當了工廠角色,提供了工廠方法,同時又充當了產品角色,包含一些業務方法(單例的內容屬性)
參考資料