2012-01-02 39 views
8

假設一個類需要加載一個需要一段時間才能加載的外部庫,因此應該只加載一次。兩種自然的解決方案是使用單例模式或單態模式。在Ruby的這個特定上下文中,這兩種解決方案中的任何一種都有什麼優勢?Ruby中的單例模式與單例模式

例如:

# Using a Singleton class 
require 'singleton' 

class Parser 
    include Singleton 

    def initialize 
     @parser = load_external_library 
    end 

    def parse(sentence) 
     @parser.parse(sentence) 
    end 
end 

# Then calling using... 
Parser.instance.parse(sentence) 

對戰:

# Using a Monostate class 

class Parser 
    def self.parse(sentence) 
     @@parser ||= load_external_library 
     @@parser.parse(sentence) 
    end 
end 

# Then calling using... 
Parser.parse(sentence) 

由於第二語法是更清潔,是否有任何優點在紅寶石使用Singleton?

+0

'require'方法加載一個庫,並防止它被多次加載。 – steenslag 2012-01-02 11:09:37

+0

我特指非Ruby庫,它不能簡單地按需求來處理,雖然你的建議會指向實現同一事物的第三種方式: 'class Parser; @@ parser = load_external_library; def self.parse(sentence); @@ parser.parse(句子);結束;結束' ...然後在另一個文件中,'require'parser''。這似乎與monostate類似,但用戶代碼現在只負責一次,這可能[比預期更復雜](http://ghouston.blogspot.com/2007/05/ruby-require-idiom.html )。有什麼想法嗎? – user2398029 2012-01-02 18:32:51

回答

4

單例模式在結構上強制實現您可以使用never have more than one instance of a class at a time這一事實,並且開發人員很明顯他們正在處理單例。

monostate強制執行behavior of a singleton without the structure of the monostate

您可能會發現您仍然需要實例數據的情況。因此,一個單一的會更好。您可以創建實例,使用方法來影響實例數據並仍然可以訪問靜態數據。對於單身人士,你不能擁有實例數據。

此外,如果您打算從單例派生類,並且希望這些類是單例類型,那麼您更好的選擇是單例。那是因爲所有來自單穩態的類都是單穩態的。派生單類的類默認情況下不是單例。您必須將靜態方法和屬性添加到每個派生類。