Module: Multiton

Extended by:
Inclusive
Included in:
Interval, Tuple
Defined in:
lib/more/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.

Synopsis

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

Previous Behavior

In previous versions of Multiton the #new method was made private and #instance had to be used in its stay –just like Singleton. But this is less desirable for Multiton since Multitions can have multiple instances, not just one.

So instead Multiton now defines #create as a private alias of the original #new method (just in case it is needed) and then defines #new to handle the multiton; #instance is provided as an alias for it.

– So if you must have the old behavior, all you need do is re-alias #new to #create and privatize it.

class SomeMultitonClass
  include Multiton
  alias_method :new, :create
  private :new
  ...
end

Then only #instance will be available for creating the Multiton. ++

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 Klass.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

Instance Method Details

#cloneObject

disable build-in copying methods

Raises:

  • (TypeError)


106
107
108
109
# File 'lib/more/facets/multiton.rb', line 106

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

#dupObject

Raises:

  • (TypeError)


111
112
113
114
# File 'lib/more/facets/multiton.rb', line 111

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