2012-01-02 14 views
8

Supponiamo che una classe abbia bisogno di caricare una libreria esterna che richiede un po 'di tempo per essere caricata e quindi dovrebbe essere caricata una sola volta. Due soluzioni naturali a questo sarebbero usare il modello singleton o il modello monostatico. C'è qualche vantaggio per una di queste soluzioni in questo particolare contesto in Ruby?Singleton vs. Monostate Pattern in Ruby

Ad esempio:

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

Dalla seconda sintassi è molto più pulito, vi sono eventuali vantaggi nell'utilizzo della Singleton in rubino?

+0

Il metodo 'require' carica una libreria e ne impedisce il caricamento più di una volta. – steenslag

+0

Mi riferivo specificamente a una libreria non Ruby, che non può essere gestita semplicemente da require, sebbene il tuo suggerimento indichi un terzo modo per ottenere la stessa cosa: 'Class Parser; @@ parser = load_external_library; def self.parse (frase); @@ parser.parse (frase); fine; fine' ... quindi in un altro file, 'richiede 'parser''. Questo sembra simile alla monostazione, ma il codice utente ora è responsabile di richiederlo solo una volta, che può essere [più complicato del previsto] (http://ghouston.blogspot.com/2007/05/ruby-require-idiom.html). qualche idea? – user2398029

risposta

4

Il modello singleton applica strutturalmente il fatto che è possibile never have more than one instance of a class at a time ed è ovvio agli sviluppatori che hanno a che fare con un singleton.

Il monostato applica lo behavior of a singleton without the structure of the monostate.

Potresti trovare situazioni in cui hai ancora bisogno di dati di istanza. Quindi un monostato sarebbe meglio. È possibile creare l'istanza, utilizzare i metodi per influenzare i dati di istanza e avere comunque accesso ai dati statici. Con un singleton, non puoi avere dati di istanza.

Inoltre, se hai intenzione di derivare classi dal singleton e vuoi che quelle classi siano singleton, la tua scelta migliore è la monostazione. Questo perché tutte le classi derivate da un monostato sono monostati. Classi derivate classi singleton non sono singleton di default. Dovresti aggiungere il metodo statico e l'attributo a ogni classe derivata.