js设计模式总结-单例模式

单例模式

解决的问题

保证实例只有一个,避免多个实现,从全局来看,这个实例的状态是唯一的。

实现原理

设置一个变量来记录实例,通过检测该变量是否为空来决定是否创建实例

非透明单例

所谓非透明就是用户在使用前必须知道这是一个单例类,不使用new来获取实例

    var Single = function() {}
    Single.instance = null
    Single.getInstance = function() {
        if (this.instance) {
            return this.instance
        }
        return this.instance = new Single()
    }

    var a = Single.getInstance()
    var b = Single.getInstance()

    a === b  //true

透明单例

其优点是创建实例时对用户透明,虽然多次new,但实际指向一个实例

    var Single = (function() {
        var instance = null
        return function() {
            if (instance) {
                return instance
            }
            return instance = this
        }
    })()
    var a = new Single()
    var b = new Single()
    a === b    // true

使用代理模式实现单例

上述实现单例的缺点是 单例的判断和实例的实现耦合在一起 ,特别是在构造函数传参数的时候。因此,不符合单一职责原则
采用代理的方式来将单例的判断和实例的实现解耦。

    // 真正的构造函数,负责真正的实例实现
    var _Single = function(option) {
        this.name = option.name
    }

    // 代理构造函数,主要负责单例判断
    var Single = (function() {
        var instance = null
        return function(option) {
            if (instance) return instance
            return instance = new _Single(option)
        }
    })()

实践中的应用

个人理解,单例模式主要是用于约束实例状态的唯一性,避免存在多个实例从而有多个状态。
因此,单例更多用于系统层面的全局功能,比如模态窗口。

posted @ 2016-11-06 23:27  Xinyu520  阅读(219)  评论(0)    收藏  举报