2011-11-23 41 views
1

我正在與Ruby中的單例模式打交道。Singleton模式,私有方法和單例模塊

我知道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. 將是一個很好的Singleton模式之上?
  2. 這會確保只有一個實例嗎?
  3. 有沒有辦法使用單身模塊的私人方法?

回答

2

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"