Module: Multiton
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
- #_dump(depth = -1)) ⇒ Object protected
-
#clone ⇒ Object
Disable build-in copying methods.
- #dup ⇒ Object
Methods included from Inclusive
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 |
#clone ⇒ Object
Disable build-in copying methods.
135 136 137 138 |
# File 'lib/standard/facets/multiton.rb', line 135 def clone raise TypeError, "can't clone Multiton #{self}" ##self end |
#dup ⇒ Object
140 141 142 143 |
# File 'lib/standard/facets/multiton.rb', line 140 def dup raise TypeError, "can't dup Multiton #{self}" ##self end |