javascript设计模式与开发实践的读后总结篇一:单例模式

103 阅读1分钟

单例模式

  1. 定义:保证一个类仅有一个实例,并提供全局访问点

  2. 应用场景:需要保证全局唯一,比如消息弹窗,比如推送的消息,比如vue中的全局状态管理

  3. 单例模式实现

    思路是先判断是否存在唯一实例,不存在则创建,存在则直接返回

    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 中可以直接把全局变量当做单例来使用,但是会引起全局变量污染问题

引入两种解决方式:命名空间和闭包

  1. 命名空间

    var namespace1={
     a:function(){
       console.log(1)
     }
     b:function(){
       console.log(2)
     }
    }
    
  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))
  }
}