## 33.单例模式
想象一下,如果你在一个房子里开派对,并且预计要有 20 位客人,那么每位客人都必须进入你的房间,因此每位客人都需要一扇门,因此你开始砸墙并开始为 20 扇门腾出空间。 听起来不疯狂吗? 你不认为只有一扇门可以达到这个目的吗?
假设你想在 Ruby 程序中访问数据库。 你可以编写一个类来连接它并返回结果。 假设你的程序正在与数据库同时建立 10 个连接,那么你认为复制数据库用户名,密码和查询程序的逻辑在你计算机 RAM 的 10 个位置中存在吗? 还是你认为将它放在一个地方并可以被所有人使用是有效的?
欢迎使用 Singleton 模式,无论如何,即使创建了 100 万次,Singleton 对象也可以将其存储在计算机 RAM 中的一个位置,从而节省了计算机空间。
让我们看一个非常简单的例子。 下面我们有一个名为 [multiton.rb](code/design_patterns/multiton.rb) 的程序。 输入并执行。
```rb
# multiton.rb
class Multiton
end
puts Multiton.new.object_id
puts Multiton.new.object_id
```
输出量
```rb
47002601799540
47002601799360
```
在上面的程序中,我们正在创建类`Multiton`的两个实例,并在查询其`object_id`。 如果这两个实例在 RAM 中占据相同的位置,那么我们本来会同时拥有相同的对象 ID,但是我们看到的是不同的,因此它们在 RAM 中占据了两个不同的空间。
看一下程序 [singleton_example.rb](code/design_patterns/singleton_example.rb) 。 输入并执行。
```rb
# singleton_example.rb
require 'singleton'
class SingletonExample
include Singleton
end
puts SingletonExample.instance.object_id
puts SingletonExample.instance.object_id
```
Output
```rb
47257803517040
47257803517040
```
在上面的程序中,我们有一个名为`SingletonExample`的类,在其中我们称为`include Singleton`的语句,这使该类成为 Singleton。 (为此请注意,在程序的开始我们编写了`require 'singleton'`,是的,Ruby 已经在单例库中得到了烘烤。)也就是说,即使它多次初始化,它也不会在计算机 RAM 中创建其自身的副本。 实际上,我们不能在此类上调用任何`new`方法。 为了证明它仅占用 RAM 中的一个插槽,我们将其调用两次并使用此语句`puts SingletonExample.instance.object_id`打印对象 ID,这里我们创建了 singleton 类的两个实例,并且它返回相同的对象 ID,证明它不会复制自身 在 RAM 中的各个位置,因此是一个单例。
- 前言
- 红宝石
- 先决条件
- 1.安装 Ruby
- 2.在线资源
- 3.入门
- 4.比较与逻辑
- 5.循环
- 6.数组
- 7.哈希和符号
- 8.范围
- 9.功能
- 10.可变范围
- 11.类&对象
- 12.安全导航
- 13.打破大型程序
- 14.结构和 OpenStruct
- 15. Rdoc
- 16. Ruby 样式指南
- 17.模块和混入
- 18.日期和时间
- 19.文件
- 20. Proc,Lambda 和块
- 21.多线程
- 22.异常处理
- 23.正则表达式
- 24.宝石
- 25.元编程
- 26.基准
- 27.测试驱动开发
- 28.观察者模式
- 29.模板模式
- 30.工厂模式
- 31.装饰图案
- 32.适配器模式
- 33.单例模式
- 34.复合模式
- 35.建造者模式
- 36.策略模式
- 赞助商
- 捐
- 人们怎么说
- 版权
- 取得这本书