Spec-Zone.ru › Ruby 3.4

модуль Singleton

Включенные модули:
Singleton::SingletonInstanceMethods

Модуль Singleton реализует паттерн Singleton.

Использование

Для использования Singleton, включите модуль в свой класс.

class Klass
   include Singleton
   # ...
end

Это гарантирует, что может быть создан только один экземпляр класса Klass.

a,b = Klass.instance, Klass.instance

a == b
# => true

Klass.new
# => NoMethodError - new is private ...

Экземпляр создаётся при первом вызове Klass.instance().

class OtherKlass
  include Singleton
  # ...
end

ObjectSpace.each_object(OtherKlass){}
# => 0

OtherKlass.instance
ObjectSpace.each_object(OtherKlass){}
# => 1

Это поведение сохраняется при наследовании и клонировании.

Реализация

Это достигается следующим:

  • Методы Klass.new и Klass.allocate объявляются закрытыми.

  • Переопределяются методы Klass.inherited(sub_klass) и Klass.clone() для сохранения свойств Singleton при наследовании и клонировании.

  • Предоставляется метод Klass.instance(), возвращающий один и тот же объект каждый раз при вызове.

  • Переопределяется метод Klass._load(str) для вызова Klass.instance().

  • Переопределяются методы Klass#clone и Klass#dup для вызова исключений TypeError, чтобы предотвратить клонирование или дублирование.

Singleton и Marshal

По умолчанию _dump(depth) модуля Singleton возвращает пустую строку. Десериализация по умолчанию удаляет информацию о состоянии, например, переменные экземпляра из экземпляра. Классы, использующие Singleton, могут предоставить пользовательские методы _load(str) и _dump(depth) для сохранения части предыдущего состояния экземпляра.

require 'singleton'

class Example
  include Singleton
  attr_accessor :keep, :strip
  def _dump(depth)
    # this strips the @strip information from the instance
    Marshal.dump(@keep, depth)
  end

  def self._load(str)
    instance.keep = Marshal.load(str)
    instance
  end
end

a = Example.instance
a.keep = "keep this"
a.strip = "get rid of this"

stored_state = Marshal.dump(a)

a.keep = nil
a.strip = nil
b = Marshal.load(stored_state)
p a == b  #  => true
p a.keep  #  => "keep this"
p a.strip #  => nil

Константы

VERSION

Открытые методы класса

_load ()
Исходный код
# File lib/singleton.rb, line 190
  

По умолчанию вызывает instance(). Переопределите для сохранения состояния синглтона.

instance ()
Исходный код
# File lib/singleton.rb, line 194

Возвращает экземпляр синглтона.

module_with_class_methods ()
Исходный код
# File lib/singleton.rb, line 146
def self.module_with_class_methods
  SingletonClassMethods
end

Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API