Javascript設計模式(三)單例模式

單例模式的定義是:保證一個類只有僅有一個實例,並提供一個訪問它的全局訪問點。

單例模式是一種經常使用的模式,有些對象咱們每每只須要一個,好比線程池,全局緩存,window對象。html

簡單單例模式

要實現一個單例模式並不複雜,無非是用一個變量來標誌當前是否已經爲某個類建立過對象,若是是,則在下一次獲取該類的時候,直接返回以前建立的對象。緩存

var Singleton = function(name) {
    this.name = name
    this.instance = null
}

Singleton.prototype.getName = function() {
    alert(this.name)
}

Singleton.getInstance = function(name) {
    if (!this.instance) {
        this.instance = new Singleton(name)
    }
    return this.instance
}
var a = Singleton.getInstance('sven1')
var b = Singleton.getInstance('sven2')  

alert(a===b) // true

經過Singleton.getInstance來獲取Singleton類的惟一對象,這種方式相對簡單,但有問題,使用者並不知道這是一個單例類app

用代理實現的單例模式

咱們如今的目標是實現一個透明的單例類,用戶從這個類中獲取對象的時候,能夠像使用其餘普通類同樣。而且按照單一職責原則,createDiv類實現功能,proxySingletonCreateDiv類管理單例管理單例模式,達到可組合的的效果this

// 建立普通類
var CreateDiv = function(html){
    this.html = html
    this.init()
}

CreateDiv.prototype.init = function() {
    var div = document.createComment('div')
    div.innerHTML = this.html
    document.body.appendChild(div)
}

//引入代理類
var proxySingletonCreateDiv = (function() {
    var instance
    return function(html) {
        if (!instance) {
            instance = new CreateDiv(html)
        }
        return instance
    }
})()

var a = new proxySingletonCreateDiv('sven1')
var b = new proxySingletonCreateDiv('sven2')  

alert(a===b) // true

惰性單例模式

分離建立實例對象的職責與管理單例的職責。下面用建立一個登錄框舉例prototype

// 管理單例
var getSingle = function(fn) {
    var result
    return function() {
        return result || (result= fn.apply(this, arguments))
    }
}
var createLoginLayer = function() {
    var div = document.createElement('div')
    div.innerHTML = '我是登錄浮窗'
    div.style.display = 'none'
    document.body.appendChild(div)
    return div
}

var createSingleLoginLayer = getSingle(createLoginLayer)

document.getElementById('loginBtn').onclick = function(){
    var loginLayer = createSingleLoginLayer()
    loginLayer.style.display = 'block'
}

單例模式是一種簡單但很是使用的技術,特別是惰性單例技術,在合適的時候才建立對象,而且至建立惟一的一個。更奇妙的是,建立對象和管理單例的職責被分佈在兩個不一樣的方法中,這兩個方法組合起來才具備單例模式的威力。線程

相關文章
相關標籤/搜索