javascript设计模式 – 单例模式原理与应用实例分析

 更新时间:2020年04月09日 08:35:55   作者:李小强  
这篇文章主要介绍了javascript设计模式 – 单例模式原理与应用,结合实例形式分析了javascript单例模式原理、定义、应用场景及相关操作注意事项,需要的朋友可以参考下

本文实例讲述了javascript设计模式 – 单例模式。分享给大家供大家参考,具体如下:

介绍:单例模式是结构最简单的设计模式。单例模式用于创建那些在软件系统中独一无二的对象,是一个简单但很实用的设计模式。

定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。

场景:日常编码中会有很多需要重用的场景,例如弹窗,键盘输入这类公共组件,我们往往希望它只创建一次,在第二次使用时重复使用之前创建好的实例。为了节约资源,提高性能,需要保证实例对象的唯一性,就可以采用单例模式实现。使用单例模式要注意:1.某个类只能有一个实例 2.它必须自行创建这个实例 3.它必须自行向整个系统提供这个实例

示例:

单利模式有两个分支,饿汉模式单例和懒汉模式单例。我们对比看下区别:

//懒汉模式单例demo
//懒汉模式:只有在我需要实例的时候才会第一次实例化,只有当我第一次调用getInstance时才会去执行init获取实例。
var Singleton = (function () {
  var instantiated; 
  function init(){
    return {
      sayHello: function () {
        console.log('hello');
      }
    };
  }
 
  return {
    getInstance: function () {
      if(!instantiated){
        instantiated = init();
      }
      return instantiated;
    } 
  }
})();
 
//只能通过getInstance方法获取对象实例:
var instance = Singleton.getInstance();
var instance2 = Singleton.getInstance();
instance.sayHello(); //hello
instance2.sayHello(); //hello
console.log(instance === instance2); //true
 
//饿汉模式demo
//饿汉模式:在类初始化时就立刻执行getInstance进行赋值。
var Singleton = (function () {
  var instantiated = init();  //初始化时即对instantiated进行赋值
  function init(){
    return {
      sayHello: function () {
 console.log('hello');
   }
 };
  }
 
  return {
 getInstance: function () {
   return instantiated;
 } 
  }
})();
 
var instance = Singleton.getInstance();
var instance2 = Singleton.getInstance();
instance.sayHello(); //hello
instance2.sayHello(); //hello
console.log(instance === instance2); //true

以上demo思考一个问题,如果init函数是耗时操作,还能保证每个类只有一个实例吗?

在多线程的场景下,会出现init函数执行过程中再次触发getInstance。就会导致一个类存在多个实例。javascript会出现这样的问题吗?

两种单例模式对比下优缺点:饿汉模式在一开始就实例化,在资源合理利用方面落下风,懒汉模式在多线程情况下需要考虑同时初始化带来的影响。

单例模式总结:

优点:
* 严格控制实例的访问
* 节约系统性能,避免重复创建销毁对象,避免资源浪费

缺点:
* 单例模式的扩展必须修改类主体,这和我们前面介绍的开关原则冲突
* 单例模式职责过重,一定程度违背了单一职责原则,因为单例既提供了业务方法,也提供了创建对象的方法,有一定的功能耦合。

适用场景:
* 系统只需要一个实例对象
* 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结

希望本文所述对大家JavaScript程序设计有所帮助。

相关文章

  • JavaScript Array实例方法flat的实现

    JavaScript Array实例方法flat的实现

    flat() 方法用于将一个嵌套多层的数组进行扁平,返回新数组,它不会改变原始数组, flat 方法在处理多维数组时非常有用,它可以让数组操作变得更加灵活和简洁,本文给大家介绍了JavaScript Array实例方法flat的实现,需要的朋友可以参考下
    2024-03-03
  • JavaScript获得指定对象大小的方法

    JavaScript获得指定对象大小的方法

    这篇文章主要介绍了JavaScript获得指定对象大小的方法,涉及javascript针对元素遍历与属性操作的相关技巧,需要的朋友可以参考下
    2015-07-07
  • js控制input框只读实现示例

    js控制input框只读实现示例

    控制input框只读可以防止用户对数据的更改,在某些情况下还是比较实用的,下面使用js来完成这个只读实现
    2014-01-01
  • js获取css的各种样式并且设置他们的方法

    js获取css的各种样式并且设置他们的方法

    下面小编就为大家带来一篇js获取css的各种样式并且设置他们的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • JS获取当前时间的两种方法小结

    JS获取当前时间的两种方法小结

    这篇文章主要给大家介绍了关于JS获取当前时间的两种方法,在web开发中,通过js获取时间非常的常用,我这里做个总结,需要的朋友可以参考下
    2023-09-09
  • js性能优化之数组模式实例详解

    js性能优化之数组模式实例详解

    这篇文章主要为大家介绍了js性能优化之数组模式实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • JavaScript实现二维坐标点排序效果

    JavaScript实现二维坐标点排序效果

    这篇文章主要为大家详细介绍了JavaScript实现二维坐标点排序效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • JavaScript中函数的四种调用方式总结

    JavaScript中函数的四种调用方式总结

    这篇文章主要为大家详细介绍了JavaScript中函数的四种调用方式,文中的示例代码讲解详细,对我们深入掌握JavaScript有一定的帮助,需要的可以参考下
    2023-10-10
  • javascript判断元素存在和判断元素存在于实时的dom中的方法

    javascript判断元素存在和判断元素存在于实时的dom中的方法

    本文主要介绍了javascript判断元素存在和判断元素存在于实时的dom中的方法。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • JavaScript无缝滚动效果的实例代码

    JavaScript无缝滚动效果的实例代码

    本文给大家分享一段实例代码有关js实现无缝滚动效果,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下
    2017-03-03

最新评论