ts學設計模式: 第一篇: 單例模式

小諾哥發表於2018-12-02

模式定義

單例模式: 確保一個類只有一個例項, 並且提供一個全域性訪問的方法, 屬於建立型模式。

模式結構圖

單例

程式碼實現

  • 懶漢模式
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(): 靜態例項的存在性並例項化
複製程式碼

優點

  • 提供了對唯一例項的受控訪問

缺點

  • 由於單例模式中沒有抽象層, 不易擴充套件
  • 單例類的職責過重,在一定程度上違背了“單一職責原則”。因為單例類既充當了工廠角色,提供了工廠方法,同時又充當了產品角色,包含一些業務方法(單例的內容屬性)

參考資料

相關文章