設計模式之單例模式

設計模式中最簡單的酒是單例模式,單例模式的目的是爲了保證在一個進程中,某一類只有一個實例存在。如何保證一個類只有一個示例而且這個實例又能易於被訪問呢?定義一個全局變量能夠確保對象隨時均可以被訪問,但不能防止咱們實例化多個對象。數據庫

其中一個更好的解決辦法是讓類自身負責保存它的惟一示例。這個類能夠保證沒有其餘實例被建立,而且它能夠提供一個訪問該實例的方法。設計模式

單例模式的要點有三個,一是某個類只能有一個實例;二是它必須自行建立這個實例;三是它必須自行向整個系統提供這個實例。單例模式是一種對象建立型模式。單例模式又名單件模式或單態模式。服務器

什麼是單例模式

單例模式:也叫單子模式,是一種經常使用的軟件設計模式,屬於建立型模式的一種。在應用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統只須要擁有一個的全局對象,這樣有利於咱們協調系統總體的行爲。好比在某個服務器程序中,該服務器的配置信息存放在一個文件中,這些配置數據由一個單例對象統一讀取,而後服務進程中的其餘對象再經過這個單例對象獲取這些配置信息。這種方式簡化了在複雜環境下的配置管理。 —— 節選自維基百科函數

對於系統中的某些類來講,只有一個實例很重要,例如,一個系統中能夠存在多個打印任務,可是隻能有一個正在工做的任務;一個系統只能有一個窗口管理器或文件系統;一個系統只能有一個計時工具或id生成器。工具

單例模式優缺點

單例模式的目的是保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。單例模式包含的角色只有一個,就是單例類——Singleton。單例類擁有一個私有構造函數,確保用戶沒法經過new`關鍵字直接實例化它。除此以外,該模式中包含一個靜態私有成員變量與靜態公有的工廠方法,該工廠方法負責檢驗實例的存在性並實例化本身,而後存儲在靜態成員變量中,以確保只有一個實例被建立。性能

在單例模式的實現過程當中,須要注意以下三點:this

  1. 單例類的構造函數爲私有
  2. 提供一個自身的靜態私有成員變量
  3. 提供一個公有的靜態工廠方法
優勢
  1. 提供了對惟一實例的受控訪問。由於單例類封裝了它的惟一實例,因此它能夠嚴格控制客戶怎樣以及什麼時候訪問它,併爲設計及開發團隊提供了共享的概念。
  2. 因爲在系統內存中只存在一個對象,所以能夠節約系統資源,對於一些須要頻繁建立和銷燬的對象,單例模式無疑能夠提升系統的性能。
  3. 容許可變數目的實例。咱們能夠基於單例模式進行擴展,使用與單例控制類似的方法來得到指定個數的對象實例。
缺點
  1. 因爲單例模式中沒有抽象層,所以單例類的擴展有很大的困難。
  2. 單例類的職責太重,在必定程度上違背了「單一職責原則」。由於單例類既充當了工廠角色,提供了工廠方法,同時又充當了產品角色,包含一些業務方法,將產品的建立和產品的自己的功能融合到一塊兒。
  3. 濫用單例將帶來一些負面問題,如爲了節省資源將數據庫鏈接池對象設計爲單例類,可能會致使共享鏈接池對象的程序過多而出現鏈接池溢出,若是實例化的對象長時間不被利用,系統會認爲它是垃圾,會自動銷燬並回收資源,下次利用時又將從新實例化,這將致使對象狀態的丟失。

示例

單例模式主要包含一個類:spa

單例類:聲明瞭一個名爲getInstance方法,用來獲取示例的靜態方法來返回其所屬類的一個相同的示例。單例的構造函數必須對客戶端代碼隱藏。調用getInstance方法必須是獲取單例對象的惟一方式。設計

類圖以下所示:code

image

代碼示例:

//  方法1
class Singleton1 {
    private static instance : Singleton1 = new Singleton1();

    public static getInstance() : Singleton1 {
        return this.instance;
    }
};
console.log(Singleton1.getInstance(), '11111');

//  方法2
class Singleton2 {
    private static instance: Singleton2 = null;

    public static getInstance() : Singleton2 {
        if (this.instance === null) {
            this.instance = new Singleton2();
        }

        return this.instance;
    }
};
console.log(Singleton2.getInstance(), '2222');

//  方法3
class Singleton3 {
    private constructor(){
        this.instance = null;
    }

    public static getInstance() : Singleton3 {
        if (this.instance === null) {
            this.instance = new Singleton3();
        }
        return this.instance;
    }
};
console.log(Singleton3.getInstance(), '3333');

//  方法4
class Singleton4 {
    static instance:Singleton4;

    private constructor():Singleton4{
        if (Singleton4.instance === undefined) {
          Singleton4.instance = this;
        }
        return Singleton4.instance;
    }

};
console.log(Singleton4.getInstance(), '4444');

總結

單例模式做爲衆多設計模式中最簡單的一個設計模式,爲了保證某個類只存在一個實例,這個類稱爲單例類,它提供全局訪問的方法。在單例類的內部實現只生成一個實例,同時它提供一個靜態的工廠方法,讓客戶可使用它的惟一實例;爲了防止在外部對其實例化,將其構造函數設計爲私有。

相關文章
相關標籤/搜索