js单例模式及应用场景
单例模式
单例就是保证一个类只有一个实例,实现方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。
单例模式的思路:
一个类能返回一个对象的引用(并且永远是同一个)和一个获得该实例的方法(静态方法,通常使用 getInstance 名称)。那么当我们调用这个方法时,如果类持有的引用不为空就返回该引用,否者就创建该类的实例,并且将实例引用赋值给该类保持的那个引用再返回。同时将该类的构造函数定义为私有方法,避免其他函数使用该构造函数来实例化对象,只通过该类的静态方法来得到该类的唯一实例
对象字面量
在js中,实现单例最简单的方式就是使用对象字面量
var mySingleton = {property: 'something',property2: 'something else',method1: function() {console.log("hello world");}
}
var s1 = mySingleton;
var s2 = mySingleton;
console.log(s1 === s2); // true
很简单的创建了一个单例,不足之处在于没有什么封装性,所有的属性和方法都是暴露的。对于一些需要使用私有变量的情况就不适用了。我们可以扩展该对象,添加自己的私有成员和方法,然后使用闭包在内部封装这些变量和函数声明,只暴露你想暴露的属性和方法
var mySingleton = function() {// 声明私有变量和方法var privateVariable = 'something private';function showPrivate() {console.log(privateVariable);}// 共有变量和方法return {publicMethod: function() {showPrivate();},publicVar: 'the public can see this!'}
};
var singleton = mySingleton();
singleton.publicMethod(); // something private
console.log(singleton.publicVar); // the public can see this!
以上代码只是实现返回了对象作为入口点,通过入口对象可以访问到内部封装的属性和方法,这个入口对象并不是单例,实现JS单例模式主要的思路是:使用数据缓存来存储该单例,用作判断单例是否已经生成
var SingletonTester = (function(){// 构造器函数function Singleton(options){options = options || {};this.name = 'SingletonTester';this.pointX = options.pointX || 6;this.pointY = options.pointY || 10;}// 缓存单例的变量var instance;// 静态变量和方法var _static = {name: 'SingletonTester',getInstance: function(options) {if (instance === undefined) {instance = new Singleton(options);}return instance;}};return _static;
})();var singletonTest = SingletonTester.getInstance({pointX: 5,pointY: 5
})console.log(singletonTest.pointX); // 5
console.log(singletonTest.pointY); // 5var singletonTest1 = SingletonTester.getInstance({pointX: 10,pointY: 10
})
console.log(singletonTest1.pointX) // 5
console.log(singletonTest1.pointY) // 5
应用场景
1.Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗?
2.windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例
3.应用程序的日志应用,一般都用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加
4.Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源
5.数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,用单例模式来维护,就可以大大降低这种损耗
6.多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制
7.操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统
8.HttpApplication 也是单位例的典型应用。熟悉ASP.Net(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例
单例模式应用的场景一般发现在以下条件下:
(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。
js单例模式及应用场景相关推荐
- React.js 的 Web 应用场景有哪些
React.js 的 Web 应用场景有哪些 博客(Gatsby) 商业网站 作品集 论坛 评级网站 会员网站 电子学习模块 图片展示 自我推广的个人主页 职位介绍 业务目录 Quora 这样的问答网 ...
- ArcGIS JS API实现地图场景视频融合
ArcGIS JS API实现地图场景视频融合 效果展示 实现步骤 1.创建地图场景 2.引入相应模块并创建地图场景 3.获取点坐标 4.生成网格 5.生成图形并添加进场景中 总结 完整代码 效果展示 ...
- java单例模式的应用场景_java项目中单列模式适用于什么场景?
单例(Singleton)模式 也叫单态模式,是java的23种设计模式之一.网上很多介绍,我就言简意赅点了. 一.单例模式的应用场景 1.整个程序的运行中只允许有一个类的实例: 2.需要频繁实例化然 ...
- java单例模式的应用场景_单例模式的常见应用场景
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...
- 单例模式的适用场景包括:
单例模式的适用场景包括:1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时:2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时. 适用性 当类只 ...
- 来讲一讲php的单例模式及应用场景
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...
- python 动画场景_vue页面引入three.js实现3d动画场景操作
vue中安装Three.js 近来无聊顺便研究一些关于3D图形化库.three.js是JavaScript编写的WebGL第三方库.Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它通过 ...
- three.js教程创建消防场景示例二
先看下最终效果吧 开始 创建多个仓库自定义长宽高 可参考上一节three.js教程创建仓库场景示例一 addHouse(){const house1 = new House(150,80,20,t ...
- 单例模式+php+应用场景,php单例模式的常见应用场景
单例模式也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,由于设计模式讲究对象之间的关系的抽象,而单例模式只有本身一个对象,也所以有些设计大师并把把其称 ...
最新文章
- 基于深度学习的Person Re-ID(综述)
- 解决win10安装MySQL数据库出现服务无法启动的问题
- 模拟IIC与硬件IIC的区别!
- 第四周课程总结实验报告(二)
- MySQL基本操作及乱码问题的解决方法
- 倒序排序_排序算法(六):Counting Sort 计数排序
- js技巧之与或运算符 || 妙用
- pov-inc_yourself劳自己-懒惰的设计师的POV和一些Figma
- 【转】phpize学习
- 项目七samba服务器,Centos 7 配置Samba服务器
- 给2020划重点:最火的10个关键词和28个书单
- dw中html5快捷键,DW快捷键大全
- php 生僻字 拼音,php 汉字转拼音 [包含20902个基本汉字+5059生僻字]
- 音视频Share系列2---基于H.265的编码技术优化实战
- EXCEL制作柱形图逆序的意义
- 悉尼大学计算机相关专业硕士,悉尼大学计算机硕士课程详细介绍
- MyBatis的优点和缺点
- zMUD里的颜色触发
- 自己捣鼓的小程序实现订单代付的功能
- 浏览器端转盘抽奖策略实现
热门文章
- 2021年塔式起重机司机报名考试及塔式起重机司机操作证考试
- 阿里云RDS——产品系列概述
- mac+usb安装linux系统安装,Mac OS X下制作安装Linux系统的USB启动盘
- 方德操作系统 tcp6占用80端口,导致无法启动nginx
- EMUI11什么时候推送鸿蒙,EMUI11什么时候更新 EMUI11推送更新机型和时间汇总
- Web前端开发必不可少的9个开源框架
- java计算机毕业设计人事管理系统MyBatis+系统+LW文档+源码+调试部署
- #数位dp#洛谷 4317 花神的数论题
- 练习:两数相加(链表逆序存储求和数字)
- Linux- 初识man、info