デザインパターンまとめ①

ほぼすべて理解できていないため、ひとまず知識を整理するために書いた。
どういう設計をする場合にどのパターンを用いるか確認することで理解を一段上に。

共通するのは設計と実装を分けること。機能を拡張しやすくすること。
クラスを呼び出す側がそのクラスの実装を知らなくてもいいように、クッションの役割を果たすこと。

部品としてプログラムを利用できるようにする、すなわち他の部品と入れ替えても動作するようにする。
そのためにインターフェースと抽象クラスで実装されるメソッドを保証する。(subclass responsibility)

デザインパターンは相互関係。

Iterator

次の要素が存在するかどうかを返すhasNextメソッド、
次の要素を返すnextメソッドを持つ。
Iteratorを使う側は対象の実装について知る必要はない。
集合体の要素のカウント、取得などに用いられる。

Adapter

対象のインターフェースに合うように、すでに存在するクラスを継承し、拡張する。
実績のあるAPIを利用して新しいクラスを作る。
互換性を維持するさいなどに用いられる。

Template Method

スーパークラスで処理の枠組みを定める。
テンプレートメソッドの定義に抽象メソッドを用いる。
サブクラスでは抽象メソッドを実装する。
テンプレートメソッドによりロジックが共通化される。
同じロジックを用いて処理を行うが出力が異なる場合に用いる。

Factory Method

インスタンス生成のフレームワークと、実際のインスタンス生成のクラスを分けて考える。
Template Methodの応用例である。

Singleton

インスタンスが1つしかないことを保証する。
マルチスレッドの場合、参照するインスタンスが異なってしまう場合がある。
これを防ぐ。
(データベースのデッドロックに近いイメージ)

Prototype

newではなく、コピーして新しいインスタンスを生成する。
最初にインスタンスが生成された方法を知らなくても、コピーしてインスタンスを生成できる。
GUI操作によってインスタンスが生成されるドローツールなどで利用。
自分自身を複製するcloneメソッドは自分からかサブクラスからしか呼び出せない。
cloneメソッドは参照渡し。

Builder

Template Methodと同じく、ロジックを共通化する。
違いはDirectorの存在。
Directorでロジックを1つのメソッドにしてしまえば、利用側から知るべき情報が少ない?

Abstract Factory

FactoryyMethodと同じに見える。

Bridge

機能と実装を分ける。

相互関係に注目

全部どのような場合に利用するのかが分からない。
それぞれのパターンが同じものに見えてしまう。
おそらく、各デザインパターンでのクラスの相互関係を理解できていない。
ソースコードを読んでも理解できないパターンもあるため、ちょろっと振り返っただけでは理解できない。

Java言語で学ぶデザインパターンで求められること

  • パターンを身につける
  • プログラムを読んでパターンを見抜く
  • プログラムを書くときにパターンを当てはめる
  • パターン相互の関連について学ぶ
  • 具体的な問題にパターンを適用する

練習問題だけでは体験できるだけで習得には不十分と感じる。
いい勉強法はないものか。
抽象的に考えるのが苦手なので、やはりソースコードを読み込むべき?