デザインパターン-Flyweight
Flyweightパターンとは
Flyweightパターンは、再利用可能なインスタンスを保持しておき、共有したりや使い回すことで無駄なオブジェクト生成(メモリ使用)を防止する仕組みを提供するパターンです。
newによるオブジェクトの生成でメモリが圧迫してしまう場合や、一回のnewで生成に時間がかかるなど処理負荷が大きい場合の対処として利用できます。
「Flyweight」の語源はボクシングのフライ級です。
ボクシングの軽量階級のイメージから、処理の軽量化を連想させています。
構成要素
- Flyweight(フライ級)
- 軽量化対象
- 共有すべきものを表す責任を負う。
- FlyweightFactory(フライ級の工場)
- 「Flyweight」を生成管理する工場です。
- Flyweightを作成・プールして共有する責任を負う
- Client(利用者)
- 「Flyweight」パターンを適用したクラスを利用し処理します。
rubyによるFlyweightパターンの実装
#!/usr/bin/env ruby
# 軽量化対象 (フライ級)
class FlyWeight
def initialize(id)
@id= id
end
def get_id
return(@id)
end
end
# FlyweightFactory(フライ級の工場)
class FlyWeightFactory
private_class_method :new
@@singleObject = nil
# Singletonパターンで単一インスタンスを取得する
def self.create
@@singleObject = new unless @@singleObject
@@singleObject
end
# インスタンスのプールを作成する
def initialize
@pool = Hash.new
end
# インスタンスの再利用
def getFlyWeight(id)
obj = @pool[id]
if(obj == nil)
obj = FlyWeight.new(id)
@pool[id] = obj
end
return(obj)
end
end
factory = FlyWeightFactory.create
obj = factory.getFlyWeight("first")
puts(obj.get_id)
obj = factory.getFlyWeight("second")
puts(obj.get_id)
obj = factory.getFlyWeight("first") # インスタンスは新規作成ではない
puts(obj.get_id)
関連ページ
- デザインパターン
- デザインパターン-Adapter
- デザインパターン-Bridge
- デザインパターン-Composite
- デザインパターン-Decorator
- デザインパターン-Facade
- デザインパターン-Flyweight
- デザインパターン-Proxy