Шаблон синглтон против моностата в рубине - PullRequest
8 голосов
/ 02 января 2012

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

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)

Поскольку второй синтаксис намного чище, есть ли какие-либо преимущества в использовании Singleton в Ruby?

1 Ответ

4 голосов
/ 02 января 2012

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

В моностате действует behavior of a singleton without the structure of the monostate.

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

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

...