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