所谓singleton pattern,就是指程序中任何时候只存该object的一个instance。 如果每次创建一个新的instance只为了使用同样的功能,就该考虑采用singleton pattern了。比如数据库连接处理,或是前端的ajax请求等每次都一样的对象,采用Singleton模式不仅使代码简洁清晰,也减少了创建对象的开销。
一个具体的例子:
var obj1 = new Singleton();
var obj2 = new Singleton();
obj1 === obj2; // true
obj1.test = 1;
obj2.test; // => 1
obj1和obj2分别新建了一个Singleton的对象实例,但实际上他们指向的是同一个对象实例。也说明了无论何时,系统中只会存在Singleton对象的一个实例。
实现Singleton的方式非常多,最简单的如不采用constructor的话,object literal也算是Singleton。下面这种方式是我认为比较优秀的实现,不仅简洁可读,也适用于strict模式。
var Singleton = function(){
if (Singleton.prototype._singletonInstance) {
return Singleton.prototype._singletonInstance;
}
Singleton.prototype._singletonInstance = this; // first instance obect
this.test = 1;
};
这里的要点是在prototype上加上一个共享属性,指向第一个调用constructor的instance。以后再调用constructor的时候,就不再生成新的实例,而是返回先前创建的实例了。
网友评论