獨生子

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 模組已經過測試和優化,因此是實現單例的更好選擇。