独生子

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 模块已经过测试和优化,因此是实现单例的更好选择。