设计模式之JavaScript实现单例模式
单例模式
这种模式的作用就是将特定对象的实例对象数量限制为一个。
这种模式在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连接,我们肯定不希望每次点击都连接一次,整个应用中对与这个地址的连接只需要一次,就可以用到这个方法。再比如地图应用,在不同页面中都用到地图,我们甚至可以只维护一个地图对象,每次对一个地图对象进行操作,而不是每个页面都新建一个地图对象,很容易造成性能的浪费。
记录学习,互相分享。
作者:碳基修炼
链接:https://juejin.cn/post/7026522635391467550