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继承的实现
Oct 24 Javascript
Jquery AJAX 用于计算点击率(统计)
Jun 30 Javascript
Web Inspector:关于在 Sublime Text 中调试Js的介绍
Apr 18 Javascript
无缝滚动js代码通俗易懂(自写)
Jun 19 Javascript
Javascript弹出窗口的各种方法总结
Nov 11 Javascript
JS获取计算机mac地址以及IP的实现方法
Jan 08 Javascript
js基于myFocus实现轮播图效果
Feb 14 Javascript
jQuery插件zTree实现获取一级节点数据的方法
Mar 08 Javascript
探讨Vue.js的组件和模板
Oct 27 Javascript
jQuery中DOM操作原则实例分析
Aug 01 jQuery
vue+elementUI中表格高亮或字体颜色改变操作
Nov 02 Javascript
JS前端轻量fabric.js系列之画布初始化
Aug 05 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中截取字符串支持utf-8
2007/01/18 PHP
PHP新手NOTICE错误常见解决方法
2011/12/07 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
javascript 面向对象 function类
2010/05/13 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
详解JS预解析原理
2020/06/16 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
python中文编码问题小结
2014/09/28 Python
Python Paramiko模块的安装与使用详解
2016/11/18 Python
详解django三种文件下载方式
2018/04/06 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
python树的同构学习笔记
2019/09/14 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
大学生期末自我鉴定
2014/02/01 职场文书
保卫科工作岗位职责
2014/03/01 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
红色旅游心得体会
2014/09/03 职场文书
2014年接待工作总结
2014/11/26 职场文书
试用期转正工作总结2015
2015/05/28 职场文书
车间安全生产管理制度
2015/08/06 职场文书
品德与社会教学反思
2016/02/24 职场文书
婚礼必备主持词范本!
2019/07/23 职场文书
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技