单例模式
单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池,全局缓存,获知浏览器中的window对象。在JavaScript开发中,单例模式的应用同样十分广泛。
1.1实现单例模式
要实现一个标准的单例模式并不复杂,无非是用一个变量来标志当前是否已经创建过对象,如果是则在下一次获取该类的实例时,直接返回之前创建的对象。代码如下:
var Singleton = function (name) {
this.name = name
}
Singleton.instance = null
Singleton.prototype.getName = function () {
return this.name
}
Singleton.getInstance = function (name) {
if (!this.instance) {
this.instance = new Singleton(name)
}
return this.instance
}
var a = Singleton.getInstance("xiao hong")
var b = Singleton.getInstance("xiao lv")
console.log(a.getName(), b.getName()) //xiaohong xiaohong
console.log(a === b)//true
或者
var Singleton = function (name) {
this.name = name
}
Singleton.prototype.getName = function () {
return this.name
}
Singleton.getInstance = (function () {
var instance = null
return function (name) {
if (!this.instance) {
this.instance = new Singleton(name)
}
return this.instance
}
})()
var a = Singleton.getInstance("xiao hong")
var b = Singleton.getInstance("xiao lv")
console.log(a.getName(), b.getName())//xiaohong xiaohong
console.log(a === b)//true
显然,我们是通过Singleton来获取Singleton类的唯一对象,这种方式相对来说比较简单,但有一个问题,就是增加了这个类的“不透明性”,Singleton类的使用者必须知道这是一个单例类,跟以往通过new XXX的方式来获取对象不同,这里偏要使用Singleton.getInstance来获取对象。
很显然上文中的代码还有很大的优化空间,我们下面蒋一步步写出更优雅的单例模式。
1.2透明的单例模式
我们现在的