Мультитон с ограничениями размера.
Вот наивная реализация модуля Multiton, которую вы можете включить в любой класс. Число объектов по умолчанию, которое он может создать, равно 5, и вы можете переопределить это ограничение, определив метод класса с именем max_instances
, который возвращает число (максимально допустимое количество экземпляров) в вашем классе.
module Multiton
MAX_INSTANCES = 5
COUNT_HOOK = :max_instances
module MultitonClassMethods
def instance
size = @instances.size
max = respond_to?(COUNT_HOOK) ? self.send(COUNT_HOOK) : MAX_INSTANCES
@instances << new if size < max
@instances[rand(size)]
end
end
def self.included(klass)
klass.class_eval {
@instances = []
}
klass.private_class_method :new
klass.extend(MultitonClassMethods)
end
end
Включите модуль в класс, чтобы сделать его многотонным.
# Falls back to Multiton::MAX_INSTANCES
class Person
include Multiton
end
# Overrides the number of allowed instances in max_instances
class Resource
include Multiton
def self.max_instances
58
end
end
Поскольку объекты возвращаются случайным образом из пула в этом мультитоне, вы не сможете вернуть все объекты за короткий промежуток времени. Но по мере того, как запрашивается больше объектов, он должен выравниваться. Вы можете изменить это поведение в модуле Multiton
, периодически переключаясь между объектами, а не выбирая их случайным образом.
people = []
1000.times do
people << Person.instance
end
# should print 5, but may print a smaller number
p people.uniq.size
resources = []
1000.times do
resources << Resource.instance
end
# should print 58, but may print a smaller number
p resources.uniq.size