阅读 74

设计模式之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


文章分类
人工智能
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐