獨生子
Ruby Standard Library 有一個 Singleton 模組,它實現了 Singleton 模式。建立 Singleton 類的第一步是在類中要求幷包含 Singleton
模組:
require 'singleton'
class Logger
include Singleton
end
如果你嘗試像常規類一樣例項化此類,則會引發 NoMethodError
異常。建構函式是私有的,以防止意外建立其他例項:
Logger.new
#=> NoMethodError: private method `new' called for AppConfig:Class
要訪問此類的例項,我們需要使用 instance()
:
first, second = Logger.instance, Logger.instance
first == second
#=> true
記錄器示例
require 'singleton'
class Logger
include Singleton
def initialize
@log = File.open("log.txt", "a")
end
def log(msg)
@log.puts(msg)
end
end
為了使用 Logger
物件:
Logger.instance.log('message 2')
沒有 Singleton 包括
上述單例實現也可以在不包含 Singleton 模組的情況下完成。這可以通過以下方式實現:
class Logger
def self.instance
@instance ||= new
end
end
這是以下的簡寫符號:
class Logger
def self.instance
@instance = @instance || Logger.new
end
end
但是,請記住 Singleton 模組已經過測試和優化,因此是實現單例的更好選擇。