Шаблон синглтон против моностата в рубине

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

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

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

Другие вопросы по тегам