【フライウェイトパターン】

Flyweightパターン とは?

💡 同じ文字を何万個も作らず、1つのインスタンスを使い回す節約術
📌 このページのポイント
Flyweightパターン:オブジェクトを共有してメモリ節約 Flyweightプール A インスタンス B インスタンス 内部状態(共有) フォント・形状など テキスト表示(外部状態) A B A B A A B 各文字は位置情報(外部状態)を別管理 共有なし(通常) 100文字 = 100オブジェクト メモリ大量消費 Flyweight使用 100文字 = 文字種数のオブジェクト メモリを大幅節約
Flyweightパターン:同じオブジェクトを共有してメモリを節約
ひよこ ひよこ

テキストエディタって文字が何万個もあるけど、全部別のオブジェクトなの?

ペンギン先生 ペンギン先生

もし全部別々のオブジェクトを作ったら、メモリがすぐ枯渇してしまうよ。そこでFlyweightパターンの出番だよ。

ひよこ ひよこ

どうやってメモリを節約するの?

ペンギン先生 ペンギン先生

「A」という文字のオブジェクトは1つだけ作って、画面に表示されるすべての「A」で共有するんだ。フォントや形など変わらない情報(内部状態)を共有して、「何列目の何行目にある」みたいな位置情報(外部状態)は呼び出し元が管理するよ。

ひよこ ひよこ

なるほど!文字そのものは共有して、位置は別管理するんだね。

ペンギン先生 ペンギン先生

その通り!ゲームで木や草を何千本も表示するときも同じで、木の形状データは1つ共有して、座標や大きさだけ変えるんだよ。

ひよこ ひよこ

Singletonパターンと似てるね?

ペンギン先生 ペンギン先生

Singletonはインスタンスが1つだけ存在する設計で、FlyweightはキャラクターAはA用の1インスタンス、BはB用の1インスタンスと種類ごとに1つ共有する点が違うよ。Factoryと組み合わせてキャッシュ管理するのが定番だよ。

ひよこ ひよこ

大量表示が必要なゲームやエディタで大活躍なんだね!

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Flyweightパターン」って出てきたら「大量オブジェクトを共有してメモリを節約する設計」と思えばだいたいOK!
📖 おまけ:英語の意味
「Flyweight Pattern」 = 軽量級パターン
💬 ボクシングの「フライ級(最軽量)」から名づけられ、オブジェクトを極力軽く(少なく)する意図を表しているんだよ
← 用語集にもどる