单例模式,私有方法和单例模块

时间:2011-11-23 08:40:58

标签: ruby singleton access-specifier

我在Ruby中使用单例模式。

我知道singleton实现了一个对象的单个实例,但我不太明白我们是否可以在没有singleton模块的情况下复制它。

然后是私有方法的问题;现在我必须做这样的事情:

class MyTestClass
  private_class_method :new
  class << self
    def test
      puts hello
    end

    private
    def hello
      'hello world'
    end
  end
end

MyTestClass.test

所以我的问题是:

  1. 以上是一个好的单身人士模式吗?
  2. 这会确保只有一个实例吗?
  3. 有没有办法让私有方法使用单例模块?

1 个答案:

答案 0 :(得分:2)

  

1。上面是一个好的单身人士模式

可能不是。仅使用类方法,您无法获得为单个“实例”执行initialize函数的好处,因此它缺少一些您通常在Singleton中找到的部分。 Ruby足够灵活,因此您可以根据需要将任何缺少的功能固定到“类”对象上,但它看起来很丑陋。

  

2。这会确保只有一个实例吗?

是。您正在修改表示类的对象,并且只有一个。

  

3。有没有办法让私有方法使用单例模块?

是。你有没有尝试过?就像你期望的那样。

class Test
  include Singleton
  def public_test
    "foo"
  end
  private
  def private_test
    "bar"
  end
end

Test.instance.public_test  # => "foo"
Test.instance.private_test # => throws exception
Test.instance.send(:private_test) # => "bar"