实例:模块的 Singleton 模式

Singleton 模式指的是调用一个类,任何时候返回的都是同一个实例。

对于 Node 来说,模块文件可以看成是一个类。怎么保证每次执行这个模块文件,返回的都是同一个实例呢?

很容易想到,可以把实例放到顶层对象global

  1. // mod.js
  2. function A() {
  3. this.foo = 'hello';
  4. }
  5. if (!global._foo) {
  6. global._foo = new A();
  7. }
  8. module.exports = global._foo;

然后,加载上面的mod.js

  1. const a = require('./mod.js');
  2. console.log(a.foo);

上面代码中,变量a任何时候加载的都是A的同一个实例。

但是,这里有一个问题,全局变量global._foo是可写的,任何文件都可以修改。

  1. const a = require('./mod.js');
  2. global._foo = 123;

上面的代码,会使得别的脚本加载mod.js都失真。

为了防止这种情况出现,我们就可以使用 Symbol。

  1. // mod.js
  2. const FOO_KEY = Symbol.for('foo');
  3. function A() {
  4. this.foo = 'hello';
  5. }
  6. if (!global[FOO_KEY]) {
  7. global[FOO_KEY] = new A();
  8. }
  9. module.exports = global[FOO_KEY];

上面代码中,可以保证global[FOO_KEY]不会被无意间覆盖,但还是可以被改写。

  1. const a = require('./mod.js');
  2. global[Symbol.for('foo')] = 123;

如果键名使用Symbol方法生成,那么外部将无法引用这个值,当然也就无法改写。

  1. // mod.js
  2. const FOO_KEY = Symbol('foo');
  3. // 后面代码相同 ……

上面代码将导致其他脚本都无法引用FOO_KEY。但这样也有一个问题,就是如果多次执行这个脚本,每次得到的FOO_KEY都是不一样的。虽然 Node 会将脚本的执行结果缓存,一般情况下,不会多次执行同一个脚本,但是用户可以手动清除缓存,所以也不是完全可靠。

es6 实例:模块的 Singleton 模式相关推荐

  1. 细颗粒度Singleton模式实现

    作为一个很典型的设计模式,Singleton模式常常被用来展示设计模式的技巧,并且随着技术的演进,.NET语言和Java都已经把经典<Design Patterns : Elements of ...

  2. js中singleton模式解析及运用

    singleton模式,又名单例模式.顾名思义,就是只能实例化一次的类(javascript中没有真正的类,我们通常用函数来模拟类,习惯称之为"伪类").具体地说,singleto ...

  3. Android发展Singleton模式

    这是什么Singleton模式?它是Java23之间的一种模式,在Android发展也有着广泛的应用,例Calander类别,当对象是由未创建 new Calander而是Calander.getIn ...

  4. (转)Spring中Singleton模式的线程安全

    不知道哪里的文章,总结性还是比较好的.但是代码凌乱,有的还没有图.如果找到原文了可以进行替换! spring中的单例 spring中管理的bean实例默认情况下是单例的[sigleton类型],就还有 ...

  5. Singleton模式学习

    动机(Motivation) 在软件系统中,经常有这样一些类,必须保证它们在系统中只存在一个类的实例,才能确保它们逻辑的正确性,以及良好的效率 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实 ...

  6. Design Pattern: Singleton 模式

    一句话概括:保证一个类仅有一个实例,并提供一个访问它的全局访问点. Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance).  很多 ...

  7. 剑指 offer set 28 实现 Singleton 模式

    singleton 模式又称单例模式, 它能够保证只有一个实例. 在多线程环境中, 需要小心设计, 防止两个线程同时创建两个实例. 解法 1. 能在多线程中工作但效率不高 public sealed ...

  8. Singleton模式的实现

    1.实现Singleton模式 设计一个类,我们只能生成该类的一个实例. 2.低级解法一:只适用于单线程环境 因为我们只能生成一个实例,所以我们必须把构造函数设置为私有函数已禁止他人创建实例.可以定义 ...

  9. 人工智能——Singleton模式

    上次在状态模式中的设计有一个严重的问题,就是如下: voidCTroll::ChageState(CState* pNewState) {        deletem_pCurrentState; ...

最新文章

  1. readelf源码学习
  2. Kotlin实战指南四:区间
  3. 通用权限管理系统组件 (GPM - General Permissions Manager) - 支持请求
  4. Java简单内存解析
  5. react实现多行文本超出加省略号
  6. 让其他CMS黯然失色的we7CMS
  7. Mac废纸篓批量还原的方法
  8. 一个讲课截屏 清明DAY2
  9. python thread 共享数据
  10. Spring-beans-FactoryBean
  11. Windows 10版本business_editions和consumer_editions的区别?
  12. 训练赛第三场A题 zoj 559
  13. ACL与磁盘配额结合应用小结
  14. SQL Server 2008安装图解教程
  15. 将1自动补位为01_英雄联盟如何避免被自动补位到辅助位置
  16. 复变函数知识点整理1-3
  17. Flink-CDC 动态监控 mysql 数据表
  18. 微信朋友圈广告,杀鸡取卵?
  19. Python 解密 pdf 文件
  20. 使用ESP8266-01s连接阿里云并发送数据

热门文章

  1. c# DataTable DataBinding 应用笔记
  2. 字符串在编号查询中的应用示例及常见问题.sql
  3. 利用SMS实现资产管理
  4. 博士考试考完了,庆祝一下
  5. SpringBoot项目请求路径中有正反斜杠的处理办法
  6. BUAA_OO_Unit1总结
  7. 深度揭秘“蚂蚁双链通” 1
  8. bubbo调用Failed to invoke remote method异常解决
  9. 加密Spring加载的Properties文件
  10. 规划System Center 2012 R2 Operations manager