概要
ずっと気になっていたデザインパターンを勉強したのでメモ。
「Java言語で学ぶデザインパターン入門」を購入して自分なりの言葉で理解をまとめる
生成に関するパターン
FactoryMethod
クラス図
シーケンス図
使い所(一言)
- インスタンス生成を別出しにしてまとめたいとき
利点
- インスタンス生成時に必要なフローをひとまとめにできる
- インスタンス生成呼び出し元の保守性が高まる
- インスタンス生成フローに変更が生じても呼び出し元クラスをごちゃごちゃ修正しなくて良い
例
- IDCardの生成
Abstract factory
クラス図
シーケンス図
使い所(一言)
インスタンス生成をまとめたファクトリーが複数あって、その具体的なファクトリーをちょろちょろ切り替えて使いたい場合
利点
- インスタンス生成時に必要なフローをひとまとめにできる
- インスタンス生成呼び出し元の保守性が高まる。変更時呼び出し元クラスをごちゃごちゃ修正しなくていい
- インスタンス生成をまとめた具体的なファクトリーを複数作って容易に切り替えることができる
例
- HTML内のリンクの生成やテーブルの作成
builder
クラス図
シーケンス図
使い所(一言)
呼び出し元から1つのメソッドでまとまった何かを生成したい!まとまった何かはカチカチっと入れ替え可能!
利点
- まとまった何か(クラス)の切り替えが容易に行える
例
- TEXT形式やHTML形式で文章を生成
Singleton
クラス図
シーケンス図
使い所(一言)
インスタンスを1つしか生成したくない場合
利点
- インスタンスが一つであることが担保される
Prototype
クラス図
シーケンス図
使い所(一言)
毎回インスタンス(オブジェクト)を生成するのは適さないものを複製する!
利点
- 毎度クラスで定義するには種類が多すぎる場合有効
構造に関するパターン
Adapter
クラス図
シーケンス図
使い所(一言)
既存クラスに一皮被せて自分の意図したメソッドが使えるクラスを作る
利点
- 既存クラスを崩すことなく意図したメソッドを実行することができる
- バージョンアップ等の互換性にも対応できる
Bridge
クラス図
シーケンス図
使い所(一言)
「機能」と「実装」を別クラスで実装したい時
利点
- OSによる違いなどを実装側に記載することで環境による機能実現差異を吸収してくれる
Composite
クラス図
シーケンス図
使い所(一言)
複数のクラスを単一のものと見ることで同一処理を再帰的に行いたいとき!
利点
- 毎度色々なオブジェクトのメソッドを実行せず、再帰的に処理を実行させることができる
Decorator
クラス図
シーケンス図
使い所(一言)
既存機能を様々な種類で装飾(拡張)したい時!
利点
- 同じメソッド名で最低限の機能を拡張していける
Facade
クラス図
使い所(一言)
複雑な処理を簡単な窓口(API)から利用させたい時
利点
- 内部の複雑な処理を意識せず簡単なAPIから機能を呼び出すことができる
Flyweight
クラス図
シーケンス図
使い所(一言)
インスタンスを無駄に生成せずメモリ消費を抑えたい時
利点
- メモリの消費を抑えられる
Proxy
クラス図
シーケンス図
使い所(一言)
本当に必要な時だけインスタンスを生成したい時。その手前は別クラスにやらせる。
利点
- proxyを設けることで重たい処理を最後にrealSubjectに行わせるなど遅延させることができる
振る舞いに関するパターン
Iterator
クラス図
シーケンス図
使い所(一言)
一つのまとまりをくるくる回して操作したい場合に使える!
利点
- 次の要素を呼び出したり、反復的な処理を切り出して用いることができる
TemplateMethod
クラス図
シーケンス図
使い所(一言)
ロジックを共通して定義したい時に使用!
利点
- 親クラスに共通ロジックを記載しているので大元のロジックを共有できる!
Strategy
クラス図
シーケンス図
使い所(一言)
戦略など切り替えが発生し得る大きなロジックを含むプログラムを作る時!
利点
- ロジックの切り替えを容易に行うことができる
Visitor
クラス図
シーケンス図
使い所(一言)
データ構造と処理を分離して部品としての独立性を高めたい時
利点
- 処理を修正したい時に部品クラスに影響を与えずviditorクラスだけに修正を加えれば良い
Chain of Responsibility
クラス図
シーケンス図
使い所(一言)
処理をクラス間でたらい回しにしたい時に使う
利点
- 処理を実施する各クラスが自分の処理内容だけに専念できる
Mediator
クラス図
シーケンス図
使い所(一言)
オブジェクト間の複雑な関連を一つのクラス(相談役)に任せたい時
利点
- 各Colleagueの状態をmediator一つで管理できる
- mediatorのcollagueChangedメソッドをみとけば各状態の管理を把握できる
Observer
クラス図
シーケンス図
使い所(一言)
オブジェクトの状況を外部から観察して通知を受けたら一定の処理を行いたい場合
利点
- ロジックと切り離してオブジェクトを観察させ、何か処理を行うことができる
Memento
クラス図
シーケンス図
使い所(一言)
オブジェクトの状態を保存したり再現したりしたい場合
利点
- 直前の状態を保持できる
State
クラス図
シーケンス図
使い所(一言)
状態により処理の内容が異なる場合
利点
- 状態による違いをif文で記載する必要がない
Command
クラス図
シーケンス図
使い所(一言)
実行する処理をメソッドではなくクラス単位で扱いたい時
利点
- コマンドの実行を履歴として残したりできる
- マクロとしてコマンドを実行することができる
Interpreter
クラス図
使い所(一言)
ミニ言語を作成し既存クラスを意図した通りに動かす!
利点
- 問題を解決するためにダイレクトな手段を取れる
- 自分の意図した仕様を考え実現するミニ言語を作成する