在Ruby标准库中,我们有Singleton类:
http://ruby-doc.org/stdlib/libdoc/singleton/rdoc/index.html
我们可以通过在内部包含这个类来使任何类成为单例。我很少看到这个用过。什么时候使用这个Singleton类而不仅仅使用普通的旧类方法 - 也称为单例方法?
以另一种方式说:哪种Singleton编码约定是最好的,为什么?以下是我能想到的三种方式:
require 'singleton'
class Foo
include Singleton
# method definitions go here...
end
Foo.instance.do_something!
对战
class Foo
class << self
# method definitions go here...
end
end
Foo.do_something!
对战
module Foo
class << self
# method definitions go here...
end
end
Foo.do_something!
答案 0 :(得分:4)
警告:提前意见!
如果您只需要一个对象,只需使用一个对象:
class << (Foo = Object.new)
# method definitions go here...
end
Foo.do_something!
模块用于在对象之间共享行为。类是对象的工厂。请注意复数:如果您只有一个对象,则既不需要共享行为的工具也不需要工厂来生成多个副本。
这是否被认为是惯用的Ruby在很大程度上取决于你所谈论的“Ruby”:你是在谈论Rails程序员使用的Ruby,Smalltalk程序员使用的Ruby,Java程序员使用的Ruby还是Ruby编写的Ruby Ruby程序员使用?这些不同社区使用的风格存在显着差异。
例如,旧时代像David Alan Black这样的Rubyist倾向于使用对象和单例方法开始始终。只有当他们稍后发现对象之间的重复行为时,他们才会将该行为提取到mixin中并将extend
对象提取出来。 (注意,在这个阶段,仍然没有任何类!)
同样,只有通过重构而不是通过前期设计创建类,当和对象之间存在重复结构时 时才会创建类。
答案 1 :(得分:0)
我见过的最常见的方法既不是单身也不是你永远不会实例化的类。最常见和惯用的方法是模块。