单例模式的简单实现

64 阅读1分钟
单例模式

定义:一个类仅有一个实例,并提供一个访问它的全局访问点。

实际应用:全局弹窗,无论点击或关闭多少次,弹窗在页面上只会被创建一次。

如何实现:通过一个变量标识去记录当前类是否已经实例化过,创建过就直接返回,否则就直接new实例化对象。

代码举例
var createDom = (function() {
    var instance = null
    var create = function(params) {
        if(instance) return instance
        this.domContext = params
        var div = document.createElement("div")
        div.innerHtml = this.domContext
        document.body.appendChild(div)
    }
    return create
})()

可以看出上述写法虽然满足且实现了单例的全局唯一性,但其中的创建对象和管理单例依然都混杂在一起,如果下次还有需要创建唯一的实例,就需要把上述方法基本原样照搬执行一次,这样显然不够灵活,也不利于扩展,这个时候就需要职责分明,做到单独创建对象和管理单例,这样才能体现出单例模式的强大。

实现方式举例

管理单例:保证唯一性

var getSingle = function(fn){

    var result

    return function(){

    return result || ( result = fn.apply( this , arguments ))

    }

}

接下来创建实例的方法将以参数的形式传入getSingle,getsingle会返回一个新的函数,并且用一个封闭的变量result来保存fn的计算结果,且因为闭包形成封闭的作用域,保证了其不会被销毁。

结合起创建dom流程实现如下

var createModal = function() {

    let modal = document.createElement("div")

    modal.innerHtml = '我是一个弹窗'

    modal.style.display='none'

    return modal

}

let modal = getSingle(createModal)

document.querySelector("#btn").onclick = function() { 
    
    let modalDom = modal()
    
    modalDom.style.display = 'block'
}