Module: Multiton

Extended by:
Inclusive
Included in:
Interval, Tuple
Defined in:
lib/standard/facets/multiton.rb

Overview

Multiton

Multiton design pattern ensures only one object is allocated for a given state.

The 'multiton' pattern is similar to a singleton, but instead of only one instance, there are several similar instances. It is useful when you want to avoid constructing objects many times because of some huge expense (connecting to a database for example), require a set of similar but not identical objects, and cannot easily control how many times a contructor may be called.

class SomeMultitonClass
  include Multiton
  attr :arg
  def initialize(arg)
    @arg = arg
  end
end

a = SomeMultitonClass.new(4)
b = SomeMultitonClass.new(4)   # a and b are same object
c = SomeMultitonClass.new(2)   # c is a different object

How It Works

A pool of objects is searched for a previously cached object, if one is not found we construct one and cache it in the pool based on class and the args given to the contructor.

A limitation of this approach is that it is impossible to detect if different blocks were given to a contructor (if it takes a block). So it is the constructor arguments only which determine the uniqueness of an object. To workaround this, define the class method ::multiton_id.

def SomeMultitonClass.multiton_id(*args, &block)
  # ...
end

Which should return a hash key used to identify the object being constructed as (not) unique.

Defined Under Namespace

Modules: Inclusive, MetaMethods Classes: InstanceMutex

Instance Method Summary collapse

Methods included from Inclusive

included

Instance Method Details

#_dump(depth = -1)) ⇒ Object (protected)


149
150
151
# File 'lib/standard/facets/multiton.rb', line 149

def _dump(depth=-1)
  Marshal.dump(@multiton_initializer)
end

#cloneObject

Disable build-in copying methods.

Raises:

  • (TypeError)

135
136
137
138
# File 'lib/standard/facets/multiton.rb', line 135

def clone
  raise TypeError, "can't clone Multiton #{self}"
  ##self
end

#dupObject

Raises:

  • (TypeError)

140
141
142
143
# File 'lib/standard/facets/multiton.rb', line 140

def dup
  raise TypeError, "can't dup Multiton #{self}"
  ##self
end