Шаблон синглтон против моностата в рубине
Предположим, класс должен загрузить внешнюю библиотеку, которая требует некоторого времени для загрузки и, следовательно, должна быть загружена только один раз. Два естественных решения этой проблемы - использование одноэлементного или моностатического шаблона. Есть ли какое-либо преимущество для любого из этих решений в данном конкретном контексте в 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?
1 ответ
Шаблон синглтона структурно усиливает тот факт, что вы можете never have more than one instance of a class at a time
и разработчикам очевидно, что они имеют дело с одиночкой.
Моностат обеспечивает соблюдение behavior of a singleton without the structure of the monostate
,
Вы можете найти ситуации, когда вам все еще нужны данные экземпляра. Поэтому моностат будет лучше. Вы можете создать экземпляр, использовать методы для воздействия на данные экземпляра и при этом иметь доступ к статическим данным. С одноэлементным, вы не можете иметь данные экземпляра.
Кроме того, если вы планируете получать классы из синглтона и хотите, чтобы эти классы были синглетонами, ваш лучший выбор - моностат. Это потому, что все классы, полученные из моностата, являются моностатами. Классы, производные одноэлементными классами, по умолчанию не являются синглетонами. Вы должны добавить статический метод и атрибут к каждому производному классу.