ポイント
Flyweight(軽量級)パターン。
等価なインスタンスはいくつも作らないで、再利用して、リソース消費を抑えましょうということ。
サンプルコード
以下は、Wikipediaのコードと同じ。
http://en.wikipedia.org/wiki/Flyweight_pattern
Flyweight.rb
class Lamp
attr_accessor :color
def initialize(color)
@color = color
end
end
class TreeBranch
def initialize(branch_number)
@branch_number = branch_number
end
def hang(lamp)
puts "Hang #{lamp.color} lamp on branch #{@branch_number}"
end
end
# Flyweight Factory
class LampFactory
def initialize
@lamps = {}
end
def find_lamp(color)
if @lamps.has_key?(color)
lamp = @lamps[color]
else
lamp = Lamp.new(color)
@lamps[color] = lamp
end
return lamp
end
def total_number_of_lamps_made
@lamps.size
end
end
class ChristmasTree
def initialize
@lamp_factory = LampFactory.new
@lamps_hung = 0
dress_up_the_tree
end
def hang_lamp(color, branch_number)
TreeBranch.new(branch_number).hang(@lamp_factory.find_lamp(color))
@lamps_hung += 1
end
def dress_up_the_tree
hang_lamp('red', 1)
hang_lamp('blue', 1)
hang_lamp('yellow', 1)
hang_lamp('red', 2)
hang_lamp('blue', 2)
hang_lamp('yellow', 2)
hang_lamp('red', 3)
hang_lamp('blue', 3)
hang_lamp('yellow', 3)
hang_lamp('red', 4)
hang_lamp('blue', 4)
hang_lamp('yellow', 4)
hang_lamp('red', 5)
hang_lamp('blue', 5)
hang_lamp('yellow', 5)
hang_lamp('red', 6)
hang_lamp('blue', 6)
hang_lamp('yellow', 6)
hang_lamp('red', 7)
hang_lamp('blue', 7)
hang_lamp('yellow', 7)
puts "Made #{@lamp_factory.total_number_of_lamps_made} total lamps"
end
end
ChristmasTree.new
所感
- サンプルのコードがあまり良くないので、いつか自分で書いてみたい。
参考
http://blog.rubybestpractices.com/posts/gregory/060-issue-26-structural-design-patterns.html
https://github.com/darkslategrey/design-pattern-ruby/tree/master/flyweight
http://en.wikipedia.org/wiki/Flyweight_pattern