设计模式-单例模式-前端javascript学习笔记

77 阅读1分钟

概念: 一个类只有一个实例,并提供全局访问。 例如线程池、全局window、全局缓存等。

实现:

// 构造函数,可以随便定义
const CreateDiv = function(html) {  
    this.html = html;
    this.init();
}
CreateDiv.prototype.init = function() {  
    const div = document.createElement('div'); 
    div.innerHTML = this.html; 
    document.body.appendChild(div);
}

// 通过代理类的方式实现单例模式,保证原始类的实现逻辑干净;遵循单一职责原则;
const ProxySingletonCreateDiv = (function() {
  // 实例化类之前,先通过该变量是否已经存在,如果存在则直接返回改变量,否则创建实例,并赋值给改变量,通过闭包的形式保证变量不会被回收
  let instance; 
  return function(html) {    
    if(!instance) {      
      instance = new CreateDiv(html)
    }
    return instance;
   }
})();

**核心逻辑:**通过闭包的方式将类实例化后的对象保存到闭包的作用域下,保证变量不会被回收,在实例化类时判断该变量是否存在,如果存在则直接返回,如果不存在则执行实例化逻辑,且通过变量保存该实例化后的结果,通过代理模式保证单一职责原则,把类的实现和单例模式的实现进行分离。