You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 改造成创建 div 的类,将控制唯一实例的逻辑在代理中实现classCreateDiv{constructor(html){this.html=htmlthis.init()}init(){letdiv=document.createElement('div')div.innerHTML=this.htmldocument.body.appendChild(div)}}// 使用代理类实现 proxySingletonCreateDivletProxySingletonCreateDiv=(function(){letinstancereturnfunction(html){if(!instance){instance=newCreateDiv(html)}returninstance}})()leta=newProxySingletonCreateDiv('sven1')letb=newProxySingletonCreateDiv('sven2')console.log(a===b)
构造一个通用的代理函数
classCreateDiv{constructor(html){this.html=htmlthis.init()}init(){letdiv=document.createElement('div')div.innerHTML=this.htmldocument.body.appendChild(div)}}// 通用的单例代理函数functioncommonProxySingleton(funClass){letinstanceletfunClass=funClassreturnfunction(){if(!instance){instance=newfunClass(arguments)}returninstance}}// 因为只是一个普通函数,所以不使用 newletproxySingletonCreateDiv=commonProxySingleton(CreateDiv)leta=proxySingletonCreateDiv('sven1')letb=proxySingletonCreateDiv('sven2')// 使用 new 的话 this 指向为 commonProxySingleton 的实例// let ProxySingletonCreateDiv = new commonProxySingleton(CreateDiv)// let c = ProxySingletonCreateDiv('sven3')console.log(a===b)
定义
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
场景
有一些对象我们往往只需要一个,比如 线程池,全局缓存,浏览器中的 window 对象。
在 javascript 中的单例模式
单例模式更加适合传统的面向对象语言中的类。在 javascript 中生搬单例模式的概念并无意义。
js 中两种单例模式的体现,本质都是减少全局变量,因为全局变量也可以理解为一种单例
不透明的/标准的单例模式
上述的例子中,不透明的地方体现在我们不知道这是一个单例类,并且跟以往通过
new XXX
的方式来获取对象不同,这里偏要使用Singleton.getInstance
来获取对象。透明的单例模式
要实现一个透明的单例模式就需要允许我们使用 new 操作符来获取对象。
我们来看一个在页面中创建唯一的 div 节点的例子。
上述的代码使用自执行的匿名函数和闭包,并且让这个匿名函数返回真正 Singleton 构造方法,增加了一些程序的复杂度,阅读起来也不是很舒服。
使用代理实现单例模式
把负责管理单例的逻辑移到了代理类
proxySingletonCreateDiv
中构造一个通用的代理函数
惰性单例
在需要实例化对象的时候才创建实例,将创建实例对象的职责和管理单例的职责分别开来,独立不互相影响。
利用闭包来实现。
通用的惰性单例
优点
缺点
使用场景
总结
The text was updated successfully, but these errors were encountered: