デザインパターン-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)


関連ページ