flyweightパターンを使用する目的は、不要なオブジェクトの初期化を回避し、スペースを節約することです。GOFで定義されているように、オブジェクトには2つの状態、内在状態と外在状態があります。
- 固有の状態:フライウェイトに保存されます。フライウェイトコンテキストに依存しない情報で構成されているため、共有可能になります。
- 外因性状態:フライウェイトのコンテキストに依存し、変化するため、共有できません。クライアントオブジェクトは、必要に応じて外部状態をフライウェイトに渡す役割を果たします。
各列にテキストのすべての行が含まれ、行に文字を含めることができる単純なテキストエディターアプリケーションを開発するとします。
ここでのジレンマは、Characterクラスの設計方法です。char c
文字クラス内には、メイン(固有状態)オブジェクトであるべきです。ただし、charにはFontおよびSize(外部状態)を含めることができます。したがって、その外部状態をRow(クライアント)に保存し、必要なときにアクセスする必要があります。この目的のために、フォントとサイズを保存する2つのリストが作成されます。
Flyweightパターンに従うことで、Characterは再利用可能になり、すべてのASCIIシンボル(Character
オブジェクト)を含むオブジェクトの特定のリスト(フライウェイトプール)からオブジェクトが参照されます。
ここに視覚的に説明したものがあります:
「hello」を印刷Character
するには、5つではなく4つのオブジェクトのみが必要です。フォントが変更されると、新しいオブジェクトは必要ありません。Characterクラスに外部状態を保存していた場合、これは不可能になることに注意してください。たとえば、
class Character
{
char c;
int Size;
Font font;
....
}
このパターンを大規模なデータセットに適用すると、アプリケーションのメモリの複雑さとオブジェクトの再利用性が大幅に最適化されます。