TL;DR
生成したオブジェクトを効率よく共有することで、リソースの消費を抑えるデザインパターン。
なぜ必要か
同じオブジェクトを何度も生成せずに使い回すので、生成されるオブジェクトの数とリソースの消費を抑えられる。
仕組み
classDiagram direction BT class Flyweight { methodA() methodB() } class FlyweightFactory { pool get_flyweight() } class Client FlyweightFactory --o Flyweight Client --> FlyweightFactory: Uses
Flyweight は共有されるオブジェクトで、環境や状況によって変わらない情報だけを持つ。FlyweightFactory は、内部の pool に Flyweight のインスタンスを持っている。get_flyweight で要求されたとき、そのインスタンスがあればそれを返し、なければ新しく生成して返す。FlyweightFactory 自体には Singleton パターンが使われる。
注意点
オブジェクトを共有するので、環境や状況によって変わらないリソースにしか使えない。共有されるオブジェクトが変更されると、思わぬバグを生むことがある。また、コードが複雑になり、理解しにくくなる。
関連
- Singleton パターン
- デザインパターン