GoFデザインパターンいつ使う?のまとめ

こういう課題を解決できるGoFデザインパターンがあったはずだけど、どのデザインパターンだったかなーと忘れてしまうことがあるのでまとめました。

振る舞いに関するパターン

パターン名説明
Iteratorforやwhileで扱うデータがあるとき。
Template Methodある手順通りに処理を実行したいが、
手順の内容に様々なパターンがあるとき。
Strategyアルゴリズムを入れ替えたいとき。
Visitorデータ構造とそのデータに関する処理を別にしたいとき。
Chain of Responsibility複数のオブジェクト全てに処理をお願いしたいとき。
Mediator複数のオブジェクトにアクセスして、
その結果を別のオブジェクトに伝えなければいけないとき。
Observerあるオブジェクトのイベントを別のオブジェクトに
通知したいとき。
Mementoオブジェクトを以前の状態に戻したいとき。
State状態の変化で動作を変えたいとき。
Commandイベントをモノとして扱いたいとき。
例えばイベントの履歴をとりたいとか、
イベントを再実行したいとか。
Interpreter構文木をつくるとき。

構造に関するパターン

パターン名説明
Adapter外部のライブラリや既存のクラスなど、
インタフェースを変えたくないものにアクセスしたいとき。
Bridge複数の継承関係があるとき。
Compositeツリー構造のデータを扱いたいとき。
Decoratorオブジェクトに新しい機能を動的に追加するとき。
Facade複雑な処理の呼び出しを単純にしたいとき。
Flyweight使うたびにインスタンスを新しく作りたくないとき。
Proxy重い処理を本当に必要になったタイミングで実行したいとき。

生成に関するパターン

パターン名説明
Factory MethodTemplate Methodパターンと同じ。
ある手順通りの処理の実行の時に異なるインスタンスを
使いたいときはFactory Methodを使うといい。
Singletonあるクラスのインスタンスを1回だけしか
生成できないようにしたいとき。
Prototypeオブジェクトの複製をしたいとき。
Builderオブジェクトの作り方が複雑で、
オブジェクトを作る時に必要なモノを動的に変えたいとき。
Abstract Factoryオブジェクトの作り方が複雑で、
オブジェクトを作る時に必要なモノは固定なとき。

参考