Module: Multiton
- Defined in:
- lib/multiton.rb
Overview
The Multiton class extends Singleton Pattern to collection level The main purpose is to have a collection of sole instanses of a particular class Possible application: a cache mapped to some DB
Usage
To use Multiton, include it in your class
class Klass
include Multiton
# ...
end
A single instance identified by some <ID> is created upon the first call of Klass.create(<ID>) This ensures that there’s only one instance of the Klass for a given <ID>
a, b = Klass.create(:id), Klass.create(:id)
a == b
# => true
a.id == b.id
# => true
Before the call to Klass.initialize, instance variable @id is assigned to <ID> obtained from Klass.create
class Klass
include Multiton
attr_reader :ID
def initialize
@ID = @id
end
end
a = Klass.create(:id)
a.ID == a.id
# => true
a.ID == :id
# => true
Instance Attribute Summary collapse
-
#id ⇒ Object
readonly
Returns the value of attribute id.
Class Method Summary collapse
Instance Method Summary collapse
Instance Attribute Details
#id ⇒ Object (readonly)
Returns the value of attribute id.
41 42 43 |
# File 'lib/multiton.rb', line 41 def id @id end |
Class Method Details
.__init__(klass) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/multiton.rb', line 56 def __init__(klass) klass.instance_eval { @multiton__instances__ = {} @multiton__mutex__ = Mutex.new } def klass.new(id, *args, &blk) o = allocate o.instance_variable_set(:@id, id) o.instance_eval{initialize(*args, &blk)} o end def klass.inherited(sub) super Multiton.__init__(sub) end def klass.create(id, *args, &blk) return @multiton__instances__[id] if @multiton__instances__[id] @multiton__mutex__.synchronize { return @multiton__instances__[id] if @multiton__instances__[id] @multiton__instances__[id] = new(id, *args, &blk) } @multiton__instances__[id] end def klass.destroy(id) @multiton__mutex__.synchronize { return @multiton__instances__.delete id } end def klass.has_key?(id) @multiton__instances__.has_key? id end def klass.each(*args, &block) __instances__ = nil @multiton__mutex__.synchronize { __instances__ = @multiton__instances__.clone } __instances__.each *args, &block end def klass.to_a instances = [] each { |k, v| instances << v } instances end def klass.[](id) create id end klass end |
Instance Method Details
#_dump(depth = -1)) ⇒ Object
51 52 53 |
# File 'lib/multiton.rb', line 51 def _dump(depth = -1) raise TypeError, "can't marshall instance of singleton #{self.class}" end |
#clone ⇒ Object
43 44 45 |
# File 'lib/multiton.rb', line 43 def clone raise TypeError, "can't clone instance of singleton #{self.class}" end |
#dup ⇒ Object
47 48 49 |
# File 'lib/multiton.rb', line 47 def dup raise TypeError, "can't dup instance of singleton #{self.class}" end |