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:;与javascript:void(0)使用介绍
Jun 05 Javascript
javascript实现省市区三级联动下拉框菜单
Nov 17 Javascript
JS实现的在线调色板实例(附demo源码下载)
Mar 01 Javascript
javascript之Array 数组对象详解
Jun 07 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
Nov 29 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
Dec 30 Javascript
tsconfig.json配置详解
May 17 Javascript
微信小程序云开发 生成带参小程序码流程
May 18 Javascript
JS实现简单tab选项卡切换
Oct 25 Javascript
如何在微信小程序中存setStorage
Dec 13 Javascript
Vue事件处理原理及过程详解
Mar 11 Javascript
vue在线动态切换主题色方案
Mar 26 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中调用JAVA
2006/10/09 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
CI框架中redis缓存相关操作文件示例代码
2016/05/17 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
微信小程序 this和that详解及简单实例
2017/02/13 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
es6函数之尾递归用法实例分析
2020/04/25 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
在Python的循环体中使用else语句的方法
2015/03/30 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
sublime text 3配置使用python操作方法
2017/06/11 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
Python识别处理照片中的条形码
2020/11/16 Python
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
预备党员入党思想汇报
2014/01/04 职场文书
骨干教师考核评语
2014/12/31 职场文书
我的1919观后感
2015/06/03 职场文书
同事离别感言
2015/08/04 职场文书
大学生村官驻村工作心得体会
2016/01/23 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书
浅谈Python数学建模之数据导入
2021/06/23 Python