質問: FlyweightパターンとPrototypeパターンを見比べると、 * Prototypeはコンストラクタを用いたオブジェクトの生成コストが高いとき、コストを削減する * Flyweightはインスタンスを共有して使いまわし、オブジェクトの生成(Flyweightと違い、クローンを含め)を行わない。このため、オブジェクトの生成コスト、インスタンスのクローン時にかかるコストを削減する という違いがあるとわかりました。これだけみるとPrototypeよりもFlyweightのほうが総合的にかかるコストが少なくて、かつPrototypeで行えることも含めて行えるのではないかと思いました そこで質問ですが、 * FlyweightパターンとPrototypeパターンの違いは何でしょうか? * 「PrototypeよりもFlyweightのほうが総合的にかかるコストが少なくて、かつPrototypeで行えることも含めて行える」としたらPrototypeパターンの使用場面はどこでしょうか? 生成的・構造的パターンという違いがあるというのは知っていますが、どちらもやっていることが同じに見えてしまい悩んでいます。 よろしくお願いいたします。 参考サイト:
回答: 質問文中にもある通りですが、次の大きな差異があります。 * Prototypeパターンはオブジェクトを毎回生成します。 * Flyweightパターンはオブジェクトを(1回しか)生成しません。1つのオブジェクトを使い回します。 Flyweightパターンはオブジェクトを使い回すので、通常は不変オブジェクトに対してのみ利用できるパターンです。 他方、Prototypeパターンはそのような制約はありません。 強いてリンク先で例えて言うと、雪の結晶の色を100枚それぞれ別にしたいなら(= `Paper`が`color`フィールドを持っていてオブジェクトごとに別の値を設定したいなら)、オブジェクトは使い回せません。 つまりFlyweightパターンは適用できません。 (リンク先そのままのPrototypeパターン例だと、確かにFlyweightパターンでも実現できるので差異が分かりづらいかと思います)