Module: Multiton

Module | Multiton
In: | lib/more/facets/multiton.rb

# 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 Klass.multiton_id(*args, &block)
        # ...
      end

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

### Methods

_dump clone dup

### Classes and Modules

Module Multiton::Inclusive
Module Multiton::MetaMethods

### Public Instance methods

clone()

disable build-in copying methods

[Source]

    # File lib/more/facets/multiton.rb, line 135
      def clone
        raise TypeError, "can't clone Multiton #{self}"
        #self
      end

dup()

[Source]

    # File lib/more/facets/multiton.rb, line 140
      def dup
        raise TypeError, "can't dup Multiton #{self}"
        #self
      end

### Protected Instance methods

_dump(depth=-1)

default marshalling strategy

[Source]

    # File lib/more/facets/multiton.rb, line 149
      def _dump(depth=-1)
        Marshal.dump(@multiton_initializer)
      end

[Validate]