2012-01-02 1 views
8

Предположим, что классу необходимо загрузить внешнюю библиотеку, которая занимает некоторое время для загрузки и, следовательно, должна быть загружена только один раз. Двумя естественными решениями для этого было бы использование одноэлементного шаблона или шаблона моностата. Есть ли какое-либо преимущество для любого из этих решений в этом конкретном контексте в Ruby?Singleton vs. Monostate Pattern в 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 в Ruby?

+0

Метод 'require' загружает библиотеку и предотвращает ее загрузку более одного раза. – steenslag

+0

Я специально ссылался на библиотеку, отличную от Ruby, которая не может быть обработана просто по требованию, хотя ваше предложение указывает на третий способ достижения одного и того же: 'class Parser; @@ parser = load_external_library; def self.parse (предложение); @@ parser.parse (предложение); конец; end' ... затем в другом файле 'require 'parser''. Это похоже на моностат, но пользовательский код теперь отвечает за его требование только один раз, что может быть [более сложным, чем ожидалось] (http://ghouston.blogspot.com/2007/05/ruby-require-idiom.html). Есть предположения? – user2398029

ответ

4

Одноэлементный шаблон структурно обеспечивает тот факт, что вы можете never have more than one instance of a class at a time, и разработчикам очевидно, что они имеют дело с одноэлементным.

Моностат налагает behavior of a singleton without the structure of the monostate.

Возможно, вам понадобятся данные экземпляра. Поэтому моностат будет лучше. Вы можете создать экземпляр, использовать методы для воздействия на данные экземпляра и по-прежнему иметь доступ к статическим данным. С помощью singleton вы не можете иметь данные экземпляра.

Кроме того, если вы планируете получать классы из синглтона, и вы хотите, чтобы эти классы были одиночными, ваш лучший выбор - односторонний. Это потому, что все классы, полученные из моностата, являются моностатическими. Классы, основанные на одноэлементных классах, по умолчанию не являются одиночными. Вам нужно будет добавить статический метод и атрибут к каждому производному классу.