FlyweightパターンとPrototypeパターンを見比べると、

  * Prototypeはコンストラクタを用いたオブジェクトの生成コストが高いとき、コストを削減する
  * Flyweightはインスタンスを共有して使いまわし、オブジェクトの生成（Flyweightと違い、クローンを含め）を行わない。このため、オブジェクトの生成コスト、インスタンスのクローン時にかかるコストを削減する

という違いがあるとわかりました。これだけみるとPrototypeよりもFlyweightのほうが総合的にかかるコストが少なくて、かつPrototypeで行えることも含めて行えるのではないかと思いました

そこで質問ですが、

  * FlyweightパターンとPrototypeパターンの違いは何でしょうか？
  * 「PrototypeよりもFlyweightのほうが総合的にかかるコストが少なくて、かつPrototypeで行えることも含めて行える」としたらPrototypeパターンの使用場面はどこでしょうか？

生成的・構造的パターンという違いがあるというのは知っていますが、どちらもやっていることが同じに見えてしまい悩んでいます。

よろしくお願いいたします。

参考サイト：  
<https://www.techscore.com/tech/DesignPattern/Prototype.html/>  
<https://www.techscore.com/tech/DesignPattern/Flyweight.html/>
CC BY-SA 4.0
2021-10-12T08:33:27.103
83037
2021-10-13T19:06:25.320
45076
question
デザインパターン
FlyweightパターンとPrototypeパターンの違いと、Prototypeパターンの使用場面はどこですか？
質問文中にもある通りですが、次の大きな差異があります。

  * Prototypeパターンはオブジェクトを毎回生成します。
  * Flyweightパターンはオブジェクトを(1回しか)生成しません。1つのオブジェクトを使い回します。

Flyweightパターンはオブジェクトを使い回すので、通常は不変オブジェクトに対してのみ利用できるパターンです。  
他方、Prototypeパターンはそのような制約はありません。

* * *

強いて[リンク先](https://www.techscore.com/tech/DesignPattern/Prototype.html/)で例えて言うと、雪の結晶の色を100枚それぞれ別にしたいなら(=
`Paper`が`color`フィールドを持っていてオブジェクトごとに別の値を設定したいなら)、オブジェクトは使い回せません。  
つまりFlyweightパターンは適用できません。

(リンク先そのままのPrototypeパターン例だと、確かにFlyweightパターンでも実現できるので差異が分かりづらいかと思います)
CC BY-SA 4.0
2021-10-13T18:39:59.833
83083
2021-10-13T19:06:25.320
2021-10-13T19:06:25.320
2808
2808
83037
answer