当前位置: 首页 > 后端技术 > Node.js

javascript设计模式——单例模式

时间:2023-04-04 00:15:14 Node.js

单例模式定义:保证一个类只有一个实例,并提供一个全局访问点来访问它。单例模式场景:有些对象往往只需要有一个,比如线程池,全局缓存浏览器中的Windows对象等。1.实现单例模式实现一个标准的单例模式并不复杂,只需要用一个变量来标记是否已经为某个类创建了一个对象,如果是,则下次获取该类的实例时,直接返回之前创建的对象或者:varSingleton=function(name){this.name=name;单例。prototype.getName=function(){console.log(this.name)}Singleton.getInstance=(function(name){varinstance=nullreturnfunction(name){if(!instance){instance=newSingleton(name)}returninstance}})()vara=Singleton.getInstance('aa')varb=Singleton.getInstance('bb')console.log(a===b)//true但是这个方法添加了类"opacity",Singleton必须知道这是一个单例类,getInstance方法是不透明的,用户必须知道这个方法,当我们打印console.log(newSingleton('cc'))时,结果如下:2,透明单例模式目的:创建这个类时,可以像其他普通类一样使用;示例:我们将创建一个CreateDiv单例类,用于在页面中创建一个唯一的div节点。这里可以看到当我们console.log(b)的时候,构造函数html的值仍然是'marin',这里我想澄清一下单例模式的定义:保证一个类只有一个实例,提供一个全局的访问点访问它。但它仍然有一些缺点。为了封装判断出的标志变量实例,我们使用了一个匿名函数(自运行)和闭包,让这个匿名函数返回真正的Singleton构造方法,这样阅读起来就比较难理解,增加了代码的复杂度程序。复杂性varCreateDiv=function(html){if(instance){returninstance}this.html=html;this.init();returninstance=this}这段代码中CreateDiv的构造函数其实负责两件事,1,创建一个实例对象(instance=this)并保证只使用一个实例if(instance)。2.执行初始化init()。这里还有一个缺点(功能单一职责原则)如果有一天我们需要用到这个类,在页面上创建多个div,就是把这个类从单例类改成普通类可以产生多个实例,那么我们必须重写CreateDiv构造函数并删除控制创建的唯一标志变量varinstance。这种修改会带来不必要的麻烦。3、使用代理实现单例模式。这样CreateDiv就变成了一个普通类,只负责创建div,实现单例模式。ProxySingleton实现单例模式的核心是保证实例只有一个,提供全局访问