单例模式
这种模式的作用就是将特定对象的实例对象数量限制为一个。
这种模式在JavaScript中其实可以应用的很广泛,他的核心就是保证只有一个实例,并给全局使用。那为什么不使用全局变量呢,原因就是全局变量容易造成污染,平时开发还是得减少这些风险。
实现思路
定义一个Singleton对象负责创建和管理对象,Singleton中定义了getInstance()用来返回唯一的实例。
let Singleton = (function() {
let instance = null
function createInstance() {
let ins = new Object('only instance')
return ins
}
return {
getInstance: function() {
if(!instance) {
instance = createInstance()
}
return instance
}
}
})()
let val1 = Singleton.getInstance()
let val2 = Singleton.getInstance()
console.log(val1 === val2)//true
Singleton我们用一个立即执行的匿名函数来实现,这样就隐藏了唯一的实例,只能通过getInstance函数来获得唯一的实例。而且实现这个唯一的实例,只会在第一次调用的时候才创建,是惰性的,这也就是惰性单例模式,在实际生产中是可以有减少无谓的性能消耗的做法。
优化
但是仔细看上面的实现,创建方法和管理方法都写在一起,这就导致这个方法不是很通用,我们可以尝试把他们拆开,实现一个更通用的单例模式函数。
let Singleton = (function(fn) {
let instance = null
return {
getInstance: function() {
if(!instance) {
instance = fn.apply(this, arguments)
}
return instance
}
}
})
function createInstance() {
let ins = new Object('only instance')
return ins
}
const createOnlyObject = Singleton(createInstance)
let val1 = createOnlyObject.getInstance()
let val2 = createOnlyObject.getInstance()
console.log(val1 === val2)//true
这一次我们的实现修改一下,Singleton不再立即执行,创建实例的方法拿出来,作为参数传入Singleton,Singleton再返回一个获取该类型实例的方法。这样我们就写出了一个通用的惰性单例Singleton方法。
这种单例模式在日常的开发中还是有广泛的用处的,比如创建websocket连接,类似点击按钮建立websocket连接,我们肯定不希望每次点击都连接一次,整个应用中对与这个地址的连接只需要一次,就可以用到这个方法。再比如地图应用,在不同页面中都用到地图,我们甚至可以只维护一个地图对象,每次对一个地图对象进行操作,而不是每个页面都新建一个地图对象,很容易造成性能的浪费。
记录学习,互相分享。