es6 实例:模块的 Singleton 模式
实例:模块的 Singleton 模式
Singleton 模式指的是调用一个类,任何时候返回的都是同一个实例。
对于 Node 来说,模块文件可以看成是一个类。怎么保证每次执行这个模块文件,返回的都是同一个实例呢?
很容易想到,可以把实例放到顶层对象global
。
// mod.js
function A() {
this.foo = 'hello';
}
if (!global._foo) {
global._foo = new A();
}
module.exports = global._foo;
然后,加载上面的mod.js
。
const a = require('./mod.js');
console.log(a.foo);
上面代码中,变量a
任何时候加载的都是A
的同一个实例。
但是,这里有一个问题,全局变量global._foo
是可写的,任何文件都可以修改。
const a = require('./mod.js');
global._foo = 123;
上面的代码,会使得别的脚本加载mod.js
都失真。
为了防止这种情况出现,我们就可以使用 Symbol。
// mod.js
const FOO_KEY = Symbol.for('foo');
function A() {
this.foo = 'hello';
}
if (!global[FOO_KEY]) {
global[FOO_KEY] = new A();
}
module.exports = global[FOO_KEY];
上面代码中,可以保证global[FOO_KEY]
不会被无意间覆盖,但还是可以被改写。
const a = require('./mod.js');
global[Symbol.for('foo')] = 123;
如果键名使用Symbol
方法生成,那么外部将无法引用这个值,当然也就无法改写。
// mod.js
const FOO_KEY = Symbol('foo');
// 后面代码相同 ……
上面代码将导致其他脚本都无法引用FOO_KEY
。但这样也有一个问题,就是如果多次执行这个脚本,每次得到的FOO_KEY
都是不一样的。虽然 Node 会将脚本的执行结果缓存,一般情况下,不会多次执行同一个脚本,但是用户可以手动清除缓存,所以也不是完全可靠。
es6 实例:模块的 Singleton 模式相关推荐
- 细颗粒度Singleton模式实现
作为一个很典型的设计模式,Singleton模式常常被用来展示设计模式的技巧,并且随着技术的演进,.NET语言和Java都已经把经典<Design Patterns : Elements of ...
- js中singleton模式解析及运用
singleton模式,又名单例模式.顾名思义,就是只能实例化一次的类(javascript中没有真正的类,我们通常用函数来模拟类,习惯称之为"伪类").具体地说,singleto ...
- Android发展Singleton模式
这是什么Singleton模式?它是Java23之间的一种模式,在Android发展也有着广泛的应用,例Calander类别,当对象是由未创建 new Calander而是Calander.getIn ...
- (转)Spring中Singleton模式的线程安全
不知道哪里的文章,总结性还是比较好的.但是代码凌乱,有的还没有图.如果找到原文了可以进行替换! spring中的单例 spring中管理的bean实例默认情况下是单例的[sigleton类型],就还有 ...
- Singleton模式学习
动机(Motivation) 在软件系统中,经常有这样一些类,必须保证它们在系统中只存在一个类的实例,才能确保它们逻辑的正确性,以及良好的效率 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实 ...
- Design Pattern: Singleton 模式
一句话概括:保证一个类仅有一个实例,并提供一个访问它的全局访问点. Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance). 很多 ...
- 剑指 offer set 28 实现 Singleton 模式
singleton 模式又称单例模式, 它能够保证只有一个实例. 在多线程环境中, 需要小心设计, 防止两个线程同时创建两个实例. 解法 1. 能在多线程中工作但效率不高 public sealed ...
- Singleton模式的实现
1.实现Singleton模式 设计一个类,我们只能生成该类的一个实例. 2.低级解法一:只适用于单线程环境 因为我们只能生成一个实例,所以我们必须把构造函数设置为私有函数已禁止他人创建实例.可以定义 ...
- 人工智能——Singleton模式
上次在状态模式中的设计有一个严重的问题,就是如下: voidCTroll::ChageState(CState* pNewState) { deletem_pCurrentState; ...
最新文章
- readelf源码学习
- Kotlin实战指南四:区间
- 通用权限管理系统组件 (GPM - General Permissions Manager) - 支持请求
- Java简单内存解析
- react实现多行文本超出加省略号
- 让其他CMS黯然失色的we7CMS
- Mac废纸篓批量还原的方法
- 一个讲课截屏 清明DAY2
- python thread 共享数据
- Spring-beans-FactoryBean
- Windows 10版本business_editions和consumer_editions的区别?
- 训练赛第三场A题 zoj 559
- ACL与磁盘配额结合应用小结
- SQL Server 2008安装图解教程
- 将1自动补位为01_英雄联盟如何避免被自动补位到辅助位置
- 复变函数知识点整理1-3
- Flink-CDC 动态监控 mysql 数据表
- 微信朋友圈广告,杀鸡取卵?
- Python 解密 pdf 文件
- 使用ESP8266-01s连接阿里云并发送数据