## 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.策略模式
- 贊助商
- 捐
- 人們怎么說
- 版權
- 取得這本書