Eyes, JAPAN Blog > Flyweightパターン

Flyweightパターン

makuta

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

「Flyweight」という英単語は、「フライ級」を意味します。フライ級と言われれば、ボクシングを連想する人も多いとおもいます。(フライ級とは、ボクシングなどの体重階級の中でも軽い部類に分類できる階級です。もっと軽い階級もありますが。。)

例えば、商品情報を格納するクラスについて考えてみます。
商品情報には、商品番号や商品名などの「状況によって変わらない情報」と在庫数などの「状況によって変わる情報」があります。
ある商品を表すオブジェクトを生成するには、この商品クラスをインスタンス化しますが、「状況によって変わらない情報」を持つオブジェクトを毎回インスタンス化するのはもったいないです。なぜなら、インスタンス化された商品オブジェクトは、それも全く同じ情報を持つものだからです。
一方で在庫数をこの商品クラスに持たせるのは得策ではありません。なぜなら、インスタンス化したタイミングで在庫数が変わっている可能性があるためです。さもないと、在庫が余りすぎたり足りなかったりしてしまうでしょう。
また、多くのシステムでは商品情報をデータベースに格納しています。つまり、商品クラスをインスタンス化する際にデータベースから商品情報を取得していることが多くなります。このため、毎回インスタンス化するコストが無視できない場合も出てきます。
こういった場合、どのような対処をおこなえばよいでしょうか?
一度インスタンス化した後にそのインスタンスを使いまわした方が良さそうです。そうすれば、インスタンス化のコストを大きく抑えることができます。また、インスタンス化に伴うメモリの消費量も抑えられると期待できます。
このFlyweightパターンは、一度インスタンス化したオブジェクトを使いまわして生成されるオブジェクトの数やリソースの消費を抑えます。

Flyweightパターンの目的は、
 多数の細かいオブジェクトを効率よくサポートするために共有を利用する。 
と定義されています。
つまり、 Flyweight パターンとは、フライ級(軽量な)のオブジェクトを効率よく共有することでリソースを無駄なく使うことに焦点を当てたパターンです。オブジェクトを共有、つまり使いまわすことでメモリの節約をはかるパターンです。

ということで、Flyweightパターンは、無駄なインスタンスの生成を防ぎ、共有することでリソースを無駄なく使うことができます。

Comments are closed.