0

GoF book の Classic Flyweight パターンの実装例では、共有可能な「Characters」に文字コードのみを格納し、「GlyphContext」を使用して外部状態をツリー構造に格納します。この例では、行と列についても言及していますが、フライウェイト (「文字」オブジェクト) の「コレクション」を格納する方法については言及していません。

このパターンにより、インスタンスを共有することで膨大な数のオブジェクトを作成することを回避できることは明らかですが、キャッシュされたオブジェクトへの参照の構造を作成せずに (たとえば、ドキュメントを表すために) そのようなオブジェクトの構造を作成するにはどうすればよいでしょうか (これにより、オブジェクトが無効になります)。パターンの目的)?他の例では、キャッシュされたインスタンスを「使い捨て」オブジェクトとして使用し、構造を構築することはありませんが、一連の静的操作に置き換えることができるため、これは意味がないようです。

作成後に flyweight を参照する必要がある場合、パターンの利点は[固有状態のサイズ]/[オブジェクト参照のサイズ]として大まかに計算できると結論付けるのは正しいですか。これは、フィールドが 1 つしかないフライ級は意味がないということですか?

編集:「メモリ計算」が間違っていました...フライウェイトがなければ、とにかく参照を保存する必要がありますが、フライウェイトを使用すると、オブジェクトを保存する必要がなくなります。質問の基本的なポイントはまだ有効であるようです-パターンによって提供される節約の程度は、「論理オブジェクト」の数ではなく、固有の状態のサイズに比例します。正しいか間違っているか?

4

1 に答える 1

0

はい、そのオブジェクトを頻繁に使用する場合は、1つのフィールドフライ級オブジェクトでも意味があります。インスタンスを取得してから、新しいオブジェクトを作成する方が高速です。

Map <string name, Object yourobject>私は(Javaで)それらを保存するための良い方法を見つけました。なぜ「構造なし」が必要なのですか?

使用中のflywieghtを格納するために何らかの構造を使用しても、パターンの目的が無効になることはありません。それらを使用するには、flywieghtsのいくつかのインスタンスが必要です。実行時に作成してリストに追加するか(不要なオブジェクトを回避するために実行する必要があります)、実行前に準備することができます(魔女は「意味がない」)。

于 2011-04-07T15:12:46.340 に答える