目的
Javaのデザインパターン全23種を学んだので、その備忘録として記載する。
本記事では、全デザインパターンの概要について記載する。
デザインパターンとは
より効率的で汎用的な設計ができるように考案された、代表的なクラス設計のパターン集。
再利用性が高くコード全体の見通しが良くなるだけでなく、メンテナンスする際にも影響範囲を最小限に抑えることができる。
デザインパターンの種類
デザインパターンは、
・オブジェクトの生成
・プログラムの構造
・オブジェクトの振る舞い
に関する3つのパターンに大きく分類される。
オブジェクトの生成
オブジェクトの生成に関するパターンの一覧と概要です。全5種。
パターン名 |
概要 |
Factory Method |
複数のサブクラスをペアにして生成する。 |
Abstract Factory |
Factory Methodを専門にするクラス。 |
Builder |
コンストラクタをビルダクラスとディレクタクラスに分け、複雑な初期値のオブジェクトを生成する。 |
Prototype |
クローンをプールしておくことで、オブジェクトの生成を簡単にする。 |
Singleton |
システムの起動から終了までの間に、そのクラスのオブジェクトが1個しか生成されないことを保証する。 |
プログラムの構造
プログラムの構造に関するパターンの一覧と概要です。全7種。
パターン名 |
概要 |
Adapter |
既存クラスを修正することなく、適切なメソッドを追加することができる。 |
Bridge |
関連の強い2つのクラスについて、それぞれのクラスを継承することで拡張しても影響のないようにする。 |
Composite |
階層構造をなすオブジェクト全体に共通のインターフェスを持たせることで、一連の操作を簡単に実行することができる。 |
Decoraror |
共通のインターフェスを実装させることで、クラスの継承よりも幅広く機能を追加できる。 |
Facade |
汎用性の高いクラスのオブジェクトをまとめることで、開発者間で共有しやすくする。 |
Flyweight |
生成済みのオブジェクトをプールしておくことで、オブジェクトの生成・保持に必要な負荷を小さくする。 |
Proxy |
共通のインターフェスを持たせることで、メソッドが呼ばれたときにそれをフックして処理を加える。Decoratorと似ている。 |
オブジェクトの振る舞い
オブジェクトの振る舞いに関するパターンの一覧と概要です。全11種。
パターン名 |
概要 |
Chain of Responsibility |
リクエストの種類(引数の値)によって、複数のオブジェクトの中から適切なオブジェクトを選択して処理する。 |
Command |
リクエストの処理自体をオブジェクト化し、複雑な内容のリクエストを送る。 |
Interpreter |
構文解析の結果として得られるオブジェクト構造をそのまま使ってインタプリタを実行できるので、構文を拡張しやすくなる。 |
Iterator |
Iteratorインターフェスを使用して、オブジェクト群の構造に関係なく簡単にアクセスできるようになる。 |
Mediator |
相互作用の内容の変更や部品オブジェクトの追加が簡単にできる。 |
Memento |
オブジェクトのある瞬間での状態のスナップショットを取り出して保存しておき、それを使って元の状態を復元できる。 |
Observer |
チェックする側とされる側のクラスを切り替えたり増やしたりすることが簡単にできる。 |
State |
状態が複雑に変化しても処理内容の切り替えがシンプルに行え、コード内での状態遷移の見通しがよくなる。 |
Strategy |
プログラムの実行中に、その中で使われるアルゴリズムを簡単に切り替えることができる。 |
Template Method |
ある1つの大きな処理を複数のステップに分解し、ステップの実行順序は守りつつ、各ステップごとに処理内容を変更する。 |
Visitor |
オブジェクトの集合の中に何種類かのクラスが混在していても、それらのクラスを修正することなく処理を追加することができる。 |
最後に
デザインパターンは、再利用性やメンテナンス性を考えると非常に優秀だが、無理にデザインパターンに当てはめようとすると、かえって複雑なコードになってしまうケースもあるので注意する。