🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 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 中的各个位置,因此是一个单例。