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


Posted in Javascript onApril 09, 2020

本文实例讲述了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.3water.com/code/HtmlJsRun测试上述代码运行效果。

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

Javascript 相关文章推荐
关于页面嵌入swf覆盖div层的问题的解决方法
Feb 11 Javascript
JavaScript中的类(Class)详细介绍
Dec 30 Javascript
简介JavaScript中Boolean.toSource()方法的使用
Jun 05 Javascript
JavaScript为事件句柄绑定监听函数实例详解
Dec 15 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
May 31 Javascript
省市联动效果的简单实现代码(推荐)
Jun 06 Javascript
Element Input组件分析小结
Oct 11 Javascript
vue插件draggable实现拖拽移动图片顺序
Dec 01 Javascript
vue封装一个简单的div框选时间的组件的方法
Jan 06 Javascript
js实现网页版贪吃蛇游戏
Feb 22 Javascript
基于Electron实现桌面应用开发代码实例
Jul 07 Javascript
Vue-resource安装过程及使用方法解析
Jul 21 Javascript
微信小程序纯文本实现@功能
Apr 08 #Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
Apr 08 #Javascript
vue与iframe之间的信息交互的实现
Apr 08 #Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
Apr 08 #Javascript
antd-mobile ListView长列表的数据更新遇到的坑
Apr 08 #Javascript
详解element上传组件before-remove钩子问题解决
Apr 08 #Javascript
javascript 设计模式之享元模式原理与应用详解
Apr 08 #Javascript
You might like
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
js验证表单大全
2006/11/25 Javascript
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
JQuery each打印JS对象的方法
2013/11/13 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
2018/01/30 Javascript
js this 绑定机制深入详解
2020/04/30 Javascript
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python格式化字符串实例总结
2014/09/28 Python
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
Python正则表达式如何匹配中文
2020/05/27 Python
python利用platform模块获取系统信息
2020/10/09 Python
python pymysql库的常用操作
2020/10/16 Python
Python 实现一个简单的web服务器
2021/01/03 Python
canvas绘图按照contain或者cover方式适配并居中显示
2019/02/18 HTML / CSS
什么造成了Java里面的异常
2016/04/24 面试题
优秀学生获奖感言
2014/02/15 职场文书
晚归检讨书
2014/02/19 职场文书
刊首寄语大全
2014/04/11 职场文书
健康教育评估方案
2014/05/25 职场文书
工业设计专业自荐书
2014/06/05 职场文书
重阳节标语大全
2014/10/07 职场文书
专家推荐信范文
2015/03/26 职场文书
python opencv人脸识别考勤系统的完整源码
2021/04/26 Python
Python实现简单的猜单词
2021/06/15 Python