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 相关文章推荐
javascript新手语法小结
Jun 15 Javascript
jquery获得keycode的示例代码
Dec 30 Javascript
jQuery验证插件validate使用详解
May 11 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
Aug 23 Javascript
Vue自定义指令拖拽功能示例
Feb 17 Javascript
jQuery 实现双击编辑表格功能
Jun 19 jQuery
说说AngularJS中的$parse和$eval的用法
Sep 14 Javascript
使用async-validator编写Form组件的方法
Jan 10 Javascript
vue项目中axios使用详解
Feb 07 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
Mar 09 jQuery
浅谈Node框架接入ELK实践总结
Feb 22 Javascript
koa大型web项目中使用路由装饰器的方法示例
Apr 02 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
日本十大惊悚动漫
2020/03/04 日漫
smarty内置函数foreach用法实例
2015/01/22 PHP
php将数组转换成csv格式文件输出的方法
2015/03/14 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
js获取下拉列表的值和元素个数示例
2014/05/07 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
JS script脚本中async和defer区别详解
2020/06/24 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
python中urllib模块用法实例详解
2014/11/19 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
python类中super()和__init__()的区别
2016/10/18 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
4s店市场专员岗位职责
2014/04/09 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
2019消防宣传标语!
2019/07/10 职场文书
MongoDB数据库的安装步骤
2021/06/18 MongoDB
python使用torch随机初始化参数
2022/03/22 Python