【フライウェイトパターン】
Flyweightパターン とは?
最終更新:
💡 同じ形のデータを共有し、置く場所は別に持つ
多数のオブジェクトに重複するデータを共有し、メモリ使用量を減らすデザインパターン。共有できる内部状態と、位置など利用場面ごとに変わる外部状態を分ける。効果は重複量や管理の負担によって異なる。
📌 このページのポイント
- 同じ値として共有できる内部状態を、共通のデータとして持つ
- 位置など文脈ごとの外部状態は別に管理したり呼び出し時に渡したりする
- 共有データを不用意に変更して、他の利用先まで変えないようにする
- 重複量と参照・管理の負担によって、メモリ節約の効果は変わる
文字が何万個もあると、全部別のデータなの?
実装次第だけれど、重複する大きなデータを文字ごとに持つと、メモリを多く使うことがある。Flyweightでは共有できる情報を分けて持つよ。大量にあるだけで、すぐメモリ不足になると決まるわけではないんだ
Aは全部一つを使えばいい?
文字やフォント、サイズなど、共有する情報の組合せが同じなら、同じデータを参照できるよ。Aという文字だけで同じとは決められない。何行何列に置くかなどの外部状態は、配置ごとに別に管理するんだ
共有データを書き換えると?
同じデータを参照するほかの配置にも影響するよ。共通データは変更しない設計にしたり、違う値なら別の共有データを選んだりする。木の形状を共有して、各木の座標を別に持つ例でも同じ考え方なんだ
Singletonと同じ?
Singletonはインスタンス数を一つに制限する設計で、Flyweightの中心は重複する状態の共有だよ。共有データは値の種類ごとに複数あってよい。管理役が同じ値のデータを探し、なければ作る仕組みも使えるんだ
必ずメモリを節約できる?
重複が多く、共有するデータが大きいほど効果を得やすい。一方、参照や共有データの検索・管理にも負担がかかる。配置の個別データまでなくなるわけではないよ。実際の重複量や使用量を確かめて採用を判断するんだ
まとめ:ざっくりこれだけ覚えればOK!
「Flyweightパターン」って出てきたら「重複するデータを共有し、個別の状態は分けて持つ設計」と思えばだいたいOK!
📖 おまけ:英語の意味
「Flyweight Pattern」 = 軽量級パターン
💬 Flyweightにはボクシングのフライ級という意味があるよ。軽さを連想すると覚えやすいけれど、全てのオブジェクトを一つにする設計ではないんだ