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 相关文章推荐
Js的MessageBox
Dec 03 Javascript
javascript数组快速打乱重排的方法
Jan 02 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
Jan 07 Javascript
js关于精确计算和数值格式化以及直接引js文件
Jan 28 Javascript
json实现前后台的相互传值详解
Jan 05 Javascript
js脚本分页代码分享(7种样式)
Aug 19 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
Jun 11 Javascript
vue-router路由懒加载和权限控制详解
Dec 13 Javascript
webpack 样式加载的实现原理
Jun 12 Javascript
动态内存分配导致影响Javascript性能的问题
Dec 18 Javascript
Javascript 解构赋值详情
Nov 17 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字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
php 批量替换程序的具体实现代码
2013/10/04 PHP
CodeIgniter框架中_remap()使用方法2例
2014/03/10 PHP
php四种定界符详解
2017/02/16 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
JavaScript经典效果集锦
2010/07/06 Javascript
关于js内存泄露的一个好例子
2013/12/09 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
js实现无缝轮播图特效
2020/05/09 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
python日期相关操作实例小结
2019/06/24 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
电气工程和自动化自荐信范文
2013/12/25 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
春节联欢晚会主持词
2014/03/24 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
办公室禁烟通知
2015/04/23 职场文书
三好学生主要事迹材料
2015/11/03 职场文书
Python实现智慧校园自动评教全新版
2021/06/18 Python
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP