9

Gang of FourFlyWeight内のパターンに関する章から、FlyWeight パターンは、ほとんどのオブジェクトの状態を外部にできる場合に適用できます。

とはextrinsic stateどういう意味ですか? このパターンは、オブジェクトの共有に使用されているように感じます。オブジェクトが共有される場合、そのオブジェクトはどのようにして状態を持つことができるのでしょうか?

4

4 に答える 4

11

ワープロの例を見てみましょう:

ワープロは Character オブジェクトを扱います。Character オブジェクトの状態は、文字の内容、フォント、スタイル、場所などです (ワード プロセッサに関する限り)。ドキュメントが異なれば、文字の異なるインスタンスが使用されます。az charsだけを扱っていると仮定すると、さまざまなドキュメントでazの文字が使用されます。プールですが、別のフォント/スタイルを適用する場合があります。したがって、文字の内容をフォント/スタイルから分離すると、これらの文字を共有できます。これは、使用される文字のさまざまなインスタンスと比較して、さまざまな種類の文字の合計が少ない (この場合は 26 ですが、それ以外の場合は定数) ため、理にかなっています。さまざまなドキュメントで。これらの文字インスタンスを共有するということは、文字インスタンスのコンテンツを共有し、フォント/スタイルなどのコンテキストをこれらの文字に外部から適用することを意味します。文字コンテンツは本質的な状態であり、フォント/スタイルは外部的な状態です。上記の例では、状態を内因性状態と外因性状態に分離することで、ストレージを大幅に節約できました。

于 2013-01-21T08:34:25.450 に答える
10

extrinsic - オブジェクトのコンテキスト (外部) に属するか、そのインスタンスに固有の状態

固有 - 「FlyWeight」オブジェクトに自然に属する状態であり、永続的または不変 (内部) またはコンテキストフリーである必要があります。

于 2014-06-20T08:18:35.237 に答える
2

箇条書きの特定の文言が何であれ、メッセージを理解することが重要です: Flyweightは、状態の重要な部分が多くのオブジェクト間で共有される場合に適用されます。これは、すべてのオブジェクトで同じデータであるためです。通常、共有状態は本質的に不変です (つまり、「普遍的な真実」)。フォントフェイスの例は、これを非常に明確にしています。日常的な Java の例としてはjava.util.regex.PatternMatcherflyweight と、それを再利用してローカルの外部状態を保持するクライアント オブジェクトがあります。内部でコンパイルされた正規表現をすべて再利用して、多くMatcherの が並列に存在できます。

この引用は、あなたの質問からのものよりも物事を明確にします:

フライウェイトが共有されるほど、ストレージの節約が大きくなります。節約は、共有状態の量に応じて増加します。オブジェクトがかなりの量の固有状態と外部状態の両方を使用し、外部状態を格納するのではなく計算できる場合に、最大の節約が行われます。次に、2 つの方法でストレージを節約します。共有により固有状態のコストが削減され、外部状態と引き換えに計算時間が短縮されます。

于 2013-01-20T14:56:43.833 に答える