单例模式
-
定义:保证一个类仅有一个实例,并提供全局访问点
-
应用场景:需要保证全局唯一,比如消息弹窗,比如推送的消息,比如vue中的全局状态管理
-
单例模式实现
思路是先判断是否存在唯一实例,不存在则创建,存在则直接返回
var Singleton = function(name){ //函数被当做构造函数,首字母大写 this.name=name } Singleton.prototype.getName=function(){ alert(this.nme) } // 或es6 class class Singleton{ constructor(name){ this.name=name } getName(){ alert(this.name) } } Singleton.getInstance=(function(){ var instance=null return function(name){ if(!instance){ instance=new Singleton(name) } return instance } })()
js 中单例应用
在js 中可以直接把全局变量当做单例来使用,但是会引起全局变量污染问题
引入两种解决方式:命名空间和闭包
-
命名空间
var namespace1={ a:function(){ console.log(1) } b:function(){ console.log(2) } } -
闭包
var user=(function(){ var _name="sven",_age=29 return { getUserInfo:function(){ return _name+"_"+_age } } })()
惰性单例
在需要的时候才创建实例
var createLoginLayer=(function(){
var div
return function(){
if(!div){
if(!div){
div=document.createElement('div')
div.innerHTML="我是登录浮窗"
div.style.display="none"
document.body.appendChild("div")
}
return div
}
}
})()
缺点:违反了单一职责原则,创建对象和管理单例的逻辑都放在createLoginLayer对象内部,
下次创建别的单例,得重写一遍,无法复用
通用的惰性单例
var getSingle=function(fn){ // 管理单例 ,并将创建实例的函数作为参数传进来
var result;
return function(){
// 判断实例是否存在,不存在则创建实例
return result||(result=fn.apply(this,arguments))
}
}