javascript设计模式与开发实践单例模式

dreamerjdw      2022-02-09     385

关键词:

 

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

应用场景:有一些对象只需要一个。如线程池、全局缓存、浏览器中的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‘;
};

 

摘javascript设计模式与开发实践--单例模式

本文章所有内容均摘自《Javascript设计模式与开发实践》一书(有兴趣的可以购买),加入了一点点自己的理解,写这篇文章的目的是,加强自身对设计模式的理解,以及对于没有接触过这一块的入门者的参考。阅读本章内容,... 查看详情

javascript设计模式与开发实践阅读笔记——单例模式

定义单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。具体来说,就是保证有些对象有且只有一个,比如线程池、全局缓存、浏览器中的window对象等。在js中单例模式用途很广,比如登录悬浮窗,我希望无... 查看详情

「设计模式」javascript-设计模式之单例模式与场景实践

单例介绍上次总结了设计模式中的module模式,可能没有真真正正的使用在场景中,发现效果并不好,想要使用起来却不那么得心应手,所以这次我打算换一种方式~~从简单的场景中来看单例模式,因为JavaScript非常灵活,所以在使... 查看详情

javascript设计模式与开发实践

...this、call和apply 阅读第3章 闭包和高阶函数 第二部分 设计模式 第4章 单例模式 第5章 策略模式 第6章 代理模式 第7章 迭代器模式 第8章 发布—订阅模式 第9章 命令模式 第10章 组合模式 第11章 模板方法模式 第12... 查看详情

《javascript设计模式与开发实践》——策略模式

...一个个封装起来。将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来。一个基于策略模式的程序至少由两部分组成。第一个部 查看详情

《javascript设计模式与开发实践》学习之使用策略模式计算奖金

简洁的做法如下: 查看详情

javascript设计模式与开发实践享元模式

  享元(flyweight)模式是一种用于性能优化的模式,“fly”在这里是苍蝇的意思,意为蝇量级。享元模式的核心是运用共享技术来有效支持大量细粒度的对象。  如果系统中因为创建了大量类似的对象而导致内存占用过高,... 查看详情

javascript设计模式与开发实践装饰者模式

  在程序开发中,许多时候都并不希望某个类天生就非常庞大,一次性包含许多职责。那么我们就可以使用装饰者模式。装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象。  装... 查看详情

《javascript设计模式与开发实践》——代理模式

代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对象。... 查看详情

javascript设计模式与开发实践模板方法模式

一、模板方法模式的定义和组成  模板方法模式是一种只需使用继承就可以实现的非常简单的模式。  模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。通常在抽象父类中封装了子类的算... 查看详情

javascript设计模式与开发实践阅读笔记(10)——组合模式

组合模式:一些子对象组成一个父对象,子对象本身也可能是由一些孙对象组成。 有点类似树形结构的意思,这里举一个包含命令模式的例子1varlist=function(){//创建接口对象的函数2return{3arr:[],//执行列表用来存储需要执行的... 查看详情

javascript设计模式与开发实践迭代器模式

  迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按... 查看详情

javascript设计模式与开发实践阅读笔记——迭代器模式

迭代器模式:指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序... 查看详情

javascript设计模式与开发实践适配器模式

  适配器模式的作用是解决两个软件实体间的接口不兼容的问题。使用适配器模式之后,原本由于接口不兼容而不能工作的两个软件实体可以一起工作。  适配器的别名是包装器(wrapper),这是一个相对简单的模式。在程... 查看详情

读书javascript设计模式与开发实践

2016.08.30 《JavaScript设计模式与开发实践》曾探人民邮电出版社2016年5月第1版p13找到变化的部分并封装之,以使得容易替换;而剩下的就是不变的部分。 P49函数柯里化(currying)的作用是多次收集参数,然后作为数组传给处理... 查看详情

javascript设计模式与开发实践阅读笔记——代理模式

代理模式:是为一个对象提供一个代用品或占位符,以便控制对它的访问。代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对象... 查看详情

javascript设计模式与开发实践阅读笔记——命令模式

命令模式:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么,此时希望用一种松耦合的方式来设计软件,使得请求发送者和请求接收者能够消除彼此之间的耦合关系。 说法很... 查看详情

javascript设计模式与开发实践阅读笔记——策略模式

策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。我的理解就是把各种方法封装成函数,同时存在一个可以调用这些方法的公共函数。这样做的好处是可以消化掉内部的分支判断,使代码效率更... 查看详情