Синглтон-шаблоны, частные методы и синглтон-модуль - PullRequest
1 голос
/ 23 ноября 2011

Я борюсь с синглтон-паттернами в Ruby.

Я знаю, что синглтон реализует один экземпляр объекта, но я не совсем понимаю, можем ли мы воспроизвести его без синглтон-модуля.

Тогда есть проблема с приватными методами; Прямо сейчас я должен сделать что-то вроде этого:

class MyTestClass
  private_class_method :new
  class << self
    def test
      puts hello
    end

    private
    def hello
      'hello world'
    end
  end
end

MyTestClass.test

Итак, мои вопросы:

  1. Является ли вышеприведенный образец хорошим синглтоном?
  2. Будет ли это гарантировать, что существует только один экземпляр?
  3. Есть ли способ иметь приватные методы, использующие одноэлементный модуль?

1 Ответ

2 голосов
/ 23 ноября 2011

1.Вышеуказанный хороший паттерн синглтона

Вероятно, нет.Используя только методы класса, вы не получаете преимущества от выполнения функции initialize для вашего единственного «экземпляра», поэтому в ней отсутствуют некоторые части, которые вы обычно находите в Singleton.Ruby достаточно гибок, поэтому вы можете прикрепить любые недостающие объекты к объекту «class» по мере необходимости, но он начинает выглядеть уродливо.Будет ли это гарантировать, что существует только один экземпляр?

Да.Вы модифицируете объект, который представляет класс, и есть только один.

3.Есть ли способ использовать приватные методы с помощью одноэлементного модуля?

Да.Ты пытался?Это так, как и следовало ожидать.

class Test
  include Singleton
  def public_test
    "foo"
  end
  private
  def private_test
    "bar"
  end
end

Test.instance.public_test  # => "foo"
Test.instance.private_test # => throws exception
Test.instance.send(:private_test) # => "bar"
...