js --單例模式

定義設計模式

一個構造函數在構造出一個對象後,以後再使用這個構造函數構造對象時,不會是新的對象,依舊是上一次的對象.也就是說:::瀏覽器

確保一個類僅有一個實例,並提供一個訪問它的全局訪問點。緩存

經過一個實用場景來理解單例模式的概念。當咱們點擊登陸按鈕的時候,會出現一個登陸的彈窗,而這個彈窗是惟一的,不論咱們點擊多少次登陸按鈕,彈窗只會被建立一次。函數

單例模式使用的場景

好比線程池、全局緩存等。咱們所熟知的瀏覽器的window對象就是一個單例,在JavaScript開發中,對於這種只須要一個的對象,咱們的實現每每使用單例。學習

實現思路this

用一個變量來標識當前的類已經建立過對象,若是下次獲取當前類的實例時,直接返回以前建立的對象便可。spa

實現1:最簡單的對象字面量prototype

var singleton = {
        attr : 1,
        method : function(){ return this.attr; }
    }
var t1 = singleton ;
var t2 = singleton ;
  那麼很顯然的, t1 === t2 。

這個在日常使用的時候,仍是挺多的,在沒有學習單例設計模式的概念以前,不知道這種也屬於單例的。不過,存在的不足之處就是沒有什麼封裝,全部的屬性方法都是暴露的。對於一些須要使用私有變量的狀況也不太合適。不過就經過這個例子加深一下對單例的概念的理解。線程

實現2:設計

// 定義一個類
function Singleton(name) {
    this.name = name;
    this.instance = null;
}
// 原型擴展類的一個方法getName()
Singleton.prototype.getName = function() {
    console.log(this.name)
};
// 獲取類的實例
Singleton.getInstance = function(name) {
    if(!this.instance) {
        this.instance = new Singleton(name);
    }
    return this.instance
};

// 獲取對象1
var a = Singleton.getInstance('a');
// 獲取對象2
var b = Singleton.getInstance('b');
// 進行比較
console.log(a === b); // true

總結:

  總的來講,單例模式相對而言是各大模式中較爲簡單的,可是單例模式也是較爲經常使用而且頗有用的模式。在JS中尤其突出(每一個對象字面量均可以看作是一個單例麼~)。
    記住,是否嚴格的只須要一個實例對象的類(雖然JS沒有類的概念),那麼就要考慮使用單例模式。
    使用數據緩存來存儲該單例,用做判斷單例是否已經生成,是單例模式主要的實現思路。
相關文章
相關標籤/搜索