chenlong-io/blog

JavaScript常用设计模式之单例模式

Closed this issue · 0 comments

什么是单例模式

一句话概括:提供唯一一个对象,可以供外界访问。

举例一

我们在封装一些工具方法时,喜欢用这种方式:

const util = {
   ajax: function(){},
   random: function(){},
   ...
}

最简单的就是使用字面量的创建一个对象,里面包含一些属性和方法,util暴露给外界访问。

举例二

上面的代码有个问题,如果有私有属性或方法不想暴露出来那就不行了,我们改一下:

const utilSpace = function() {

    //私有变量
    const _privateName = 'hello';
    
    //私有方法
    function _showPrivateName() {
        console.log( _privateName )
    }
    
    //暴露给外界的对象
    return {
        showName: function(){
            _showPrivateName();
        },
        
        publicVar: "hello, I'm Tom"
    }
}

const single = utilSpace(); //向外界暴露single即可

single.showName(); // hello
single.publicVar; // hello, I'm Tom

其实上面的代码已经够用了,如果你想用更优雅或更合理的写法可以这样:

(function(){

    var instance; // 该变量用于缓存实例
    
    // 定义 Util 类
    var Util = function() {
    
        if( instance ) return instance;
        
        instance = this;
        
        //其他属性或方法
        this.xxx = 0;
        this.name = 'Tom';
    }
    
    window.Util = Util;
    
})();

var a = new Util();
var b = new Util();

console.log( a === b ) //true

上面代码中,定义一个Util类, 并用 instance 变量将 Util 实例缓存起来,当使用 new Util 时,如果 instance 已经缓存了实例,则直接将该实例返回,这样就保证不管 new 多少次,始终只会返回一个实例,达到单例的目的。

结尾

前端开发中我们遇到的单例模式有很多,比如:Dialog、Tips、Toast 等都是可以通过单例模式来搞定的。