精读《设计模式 – Singleton 单例模式》

时间:2021-1-8 作者:admin

Singleton(单例模式)

Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的。

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

其实单例模式在前端体会的不明显,原因有:

  1. 前端代码本身在单机运行,创建的任何变量都是天然分布式的,不需要担心影响另一个用户。
  2. 后端代码是一对多的,分辨出哪些资源是请求间共享的,哪些是请求内独有的很重要。

另外我们说到单例,是隐含了一个范围的,指的是在某个范围内单例,比如在一个上下文中,还是一个房间中,还是一个进程,一个线程中单例,不同场景范围会不同。

举例子

如果看不懂上面的意图介绍,没有关系,设计模式需要在日常工作里用起来,结合例子可以加深你的理解,下面我准备了三个例子,让你体会什么场景下会用到这种设计模式。

多人游戏的共享物品

玩过游戏的同学都知道,我们在每局游戏中使用的公共物品在当前房间中是唯一的,但在游戏房间间却不是唯一的,所以这些公共物品肯定有不同的类去描述,那每局游戏中怎么拿公共物品,可以保证拿到的是当前局内唯一的?

Redux 数据流

其实前端的 Redux 数据流本身就是单例模式,在一个应用中,数据是唯一的,但可以有不同的 UI 使用这份唯一的数据,甚至把一个表格组件展示在两个不同地方,比如全屏模式,但数据依然是一份,我们没有必要为了全屏展示表格,就让它再发一次取数请求,完全可以和原来的表格共享一份数据。

数据库连接池

每个 SQL 查询都依赖数据库连接池,如果每次查询都建立一次数据库连接池,则建立连接的速度会远远慢于 SQL 查询速度,因此你会怎么设计数据库连接池的获取方法?

意图解释

单例模式的意图很简单,几乎就是其字面含义:

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

对于多人游戏的共享物品,比如一口锅,要保证在一局游戏内唯一,就要提供一种方法访问到唯一实例。

Redux 数据流的 connect 装饰器就是全局访问点的一种设计。

数据库连接池可以提前初始化好,并通过固定 API 提供这个唯一实例。

结构图

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。