2012-01-02 8 views
8

Załóżmy, że klasa musi załadować bibliotekę zewnętrzną, która zajmuje trochę czasu, a zatem powinna zostać wczytana tylko raz. Dwoma naturalnymi rozwiązaniami byłoby użycie wzoru singleton lub monostatu. Czy jest jakieś korzyści dla któregoś z tych rozwiązań w tym konkretnym kontekście w Ruby?Singleton kontra Monostate Pattern in Ruby

Na przykład:

# 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) 

Versus:

# 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) 

Ponieważ druga składnia jest znacznie czystsze, czy są jakieś zalety korzystania z Singleton w Ruby?

+0

Metoda 'require' ładuje bibliotekę i zapobiega jej ładowaniu więcej niż jeden raz. – steenslag

+0

Odnosiłem się konkretnie do biblioteki nie-Ruby, której nie można obsłużyć po prostu wymaganiem, chociaż twoja sugestia wskazywałaby na trzeci sposób osiągnięcia tego samego: 'Parser klasy; @@ parser = load_external_library; def self.parse (zdanie); @@ parser.parse (zdanie); koniec; end' ... następnie w innym pliku 'require 'parser''. Wydaje się to podobne do monostatu, ale kod użytkownika jest teraz odpowiedzialny za żądanie tylko raz, co może być [trudniejsze niż oczekiwano] (http://ghouston.blogspot.com/2007/05/ruby-require-idiom.html). jakieś pomysły? – user2398029

Odpowiedz

4

Wzorzec singleton strukturalnie wymusza fakt, że można never have more than one instance of a class at a time, i jest oczywiste dla programistów, że mają do czynienia z singleton.

Monostatek wymusza behavior of a singleton without the structure of the monostate.

Być może znajdziesz sytuacje, w których nadal potrzebujesz danych instancji. Dlatego monostat byłby lepszy. Możesz utworzyć instancję, użyć metod wpływających na dane instancji i nadal mieć dostęp do danych statycznych. W przypadku singletonu nie można mieć danych instancji.

Poza tym, jeśli planujesz wywodzić klasy z singletonu i chcesz, żeby te klasy były singletonami, twoim lepszym wyborem jest monostate. A to dlatego, że wszystkie klasy wywodzące się z monostatu to monostaty. Klasy pochodne singleton domyślnie nie są pojedynczymi. Będziesz musiał dodać statyczną metodę i atrybut do każdej klasy pochodnej.