zoukankan      html  css  js  c++  java
  • javaScript设计模式与开发实践(一)单例模式

    单例模式定义:保证一个类仅有有一个实例,并提供一个访问它的全局访问点。

    应用场景:有一些对象只需要一个。如线程池、全局缓存、浏览器中的window对象等。

    实现一:

    var Singleton = function(name) {
      this.name = name;
      this.instance = null;       
    }
    
    Singleton.prototype.getName = function() {
      alert(this.name);
    };
    
    Singleton.getInstance = function() {
      if(!this.instance) {
        this.instance = new Singleton(name);
      }
      return this.instance;
    };
    
    var a = Singleton.getInstance('sven');
    

     实现一的缺点:增加了这个“类”的不透明性,使用者必须知道这是一个单例类,跟以往通过new的方式获取对象不同。

    实现二:

    var CreateDiv = (function(){
    
      var instance;
    
      var CreateDiv = function(html) {
        if(instance)
          return instance;
        this.html = html;
        this.init();
        return instance = this;
      };
    
      CreateDiv.prototype.init = function(){
        var div = document.createElement('div');
        div.innerHTML = this.html;
        document.body.appendChild(div);
      };
    
      return CreateDiv;
    })();
    
    var a = new CreateDiv('sven');
    

     实现二的缺点:使用了自执行的匿名函数和闭包,并让匿名函数返回了真正的Singleton构造方法,增加了程序复杂度。

    实现三:用代理实现单例模式

      var CreateDiv = function(html) {
        this.html = html;
        this.init();
      };
    
      CreateDiv.prototype.init = function(){
        var div = document.createElement('div');
        div.innerHTML = this.html;
        document.body.appendChild(div);
      };
    
      var ProxySingletonCreateDiv = (function(){
        
        var instance;
    
        return function(html) {
          if(!instance) {
            instance = new CreateDiv(html);
          }   
          return instance;
        };
      })();
    
      var a = new ProxySingletonCreateDiv('sven');
    

     实现三将负责管理单例的逻辑移到了代理类中。这样一来,将CreateDiv和ProxySingletonCreateDiv组合起来就可实现单例模式。

    实现四:惰性单例(需要时才创建对象实例) 重点

    var createLoginLayer = (function(){
      var div;
      return function() {
        if(!div) {
          div = document.createElement('div');
          div.innerHTML = '我是登录窗口';
          div.style.display = 'none';
          document.body.appendChild(div);
        }
        return div;
      };
    })();
    
    document.getElementById('loginBtn').onclick = function(){
      var loginLayer = createLoginLayer();
      loginLayer.style.display = 'block';
    };
    
  • 相关阅读:
    修改spring boot 的banner
    创建oracle 数据库的时候 提示 “使用database control配置数据库时,要求在当前oracle主目录中配置监听程序”
    Spring Boot 中文乱码解决
    SharePoint 2013 安装图解
    Hadoop 数据安全方案 Apache Eagle
    通用财经数据传输与监控平台1.0(泛型,接口与基类,Sql,Ibatis,Awt,Swing)
    应用Druid监控SQL语句的执行情况
    监控和剖析数据库操作 -- P6Spy、SQL Profiler、IronTrack SQL 使用简介
    Jboss7集群配置说明
    JavaMelody监控SQL
  • 原文地址:https://www.cnblogs.com/dreamerjdw/p/6430459.html
Copyright © 2011-2022 走看看