フライウェイトパターンとオブジェクトプールパターンの違いは何ですか? 質問する

フライウェイトパターンとオブジェクトプールパターンの違いは何ですか? 質問する

Flyweight パターンと Object Pool パターンは非常に似ているように思えます。どちらも、クライアントにリースされるオブジェクトのプールを持っています。違いは何でしょうか?

ベストアンサー1

それらは使用方法が異なります。

プールされたオブジェクトは、同時に 1 つの「クライアント」のみが使用できます。そのためには、プールされたオブジェクトをプールからチェックアウトし、クライアントが使用できるようにしてから、クライアントがオブジェクトをプールに戻す必要があります。プールの最大容量まで、同一オブジェクトの複数のインスタンスが存在する場合があります。

対照的に、Flyweight オブジェクトはシングルトンであり、複数のクライアントが同時に使用できます。

同時アクセスに関しては、プールされたオブジェクトは可変にすることができ、通常はスレッドセーフである必要はありません。通常、特定のインスタンスを同時に使用するスレッドは 1 つだけだからです。Flyweight は不変 (最適なオプション) にするか、スレッドセーフを実装する必要があります。(率直に言って、可変 Flyweight がまだ Flyweight であるかどうかはわかりません :))

パフォーマンスとスケーラビリティに関しては、プールがボトルネックになる可能性があります。プールされたオブジェクトがすべて使用中で、さらに多くのクライアントがそれらを必要とする場合、スレッドはプールから利用可能なオブジェクトを待機してブロックされます。これは Flyweight には当てはまりません。

おすすめ記事