【问题标题】:Singleton patterns, private methods and singleton module单例模式、私有方法和单例模块
【发布时间】:2012-01-04 13:41:31
【问题描述】:
我正在与 Ruby 中的单例模式作斗争。
我知道单例实现了一个对象的单个实例,但我不太明白我们是否可以在没有单例模块的情况下复制它。
然后是私有方法的问题;现在我必须做这样的事情:
class MyTestClass
private_class_method :new
class << self
def test
puts hello
end
private
def hello
'hello world'
end
end
end
MyTestClass.test
所以我的问题是:
- 以上是好的单例模式吗?
- 这会确保只有一个实例吗?
- 有没有办法让私有方法使用单例模块?
【问题讨论】:
标签:
ruby
singleton
access-specifier
【解决方案1】:
1 .以上是不是很好的Singleton模式
可能不会。仅使用类方法不会获得为单个“实例”执行initialize 函数的好处,因此它缺少一些您通常会在单例中找到的部分。 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"