デザインパターン入門をいまさら読んだ

Java言語で学ぶデザインパターン入門

Java言語で学ぶデザインパターン入門

デザインパターンを勉強した。これを購入したのは4年くらいだけどね。ちなみにデザインパターンについてはそこら中のページで素晴らしい説明があるけれども自分の備忘録に。。。

まちがってる可能性はかなりあるから、参照するなら他と合わせてね。

Iterator
繰り返しているオブジェクトがなんであるかを意識せずに、繰り返し処理を記述する。Javaイテレータと同じ。
Adapter
必要とするクラスが、必要とするインターフェースと異なる場合に、クラスを1枚かぶせて目的のインターフェースに合わせる。委譲を使ったものと、継承を使ったものの2種類で実現可能
Template Method
大まかな処理の流れを親クラスで定義しておき、実際の処理部分をサブクラスで実装するパターン。同じような処理を複数個作りたい場合に使用できる
Factory Method
インスタンスの生成を行うメソッドをabstractメソッドに定義しておき、実際のクラスの生成はそのサブクラスで行う。Template Methodパターンの典型的な例。
Singleton
プログラム上、クラスのインスタンスが一つしかない事を保証するパターン。Javaのstaticフィールドやsynchronizedを利用し、インスタンスが一つしか生成できないようにする。
Prototype
既にあるインスタンスをコピーして、新しいインスタンスを生成するパターン。クラスをnewして作成する事が難しい場合に利用する事がある。
Javaのcloneメソッドを利用するには、Cloneableクラスを継承してクラスを作成する。ただし、cloneメソッドは1階層しかコピーしないので必要に応じて、cloneメソッドをオーバーライドする。
利用箇所がイメージし辛いので、ヒント。
  • 同じようなクラスが多すぎる場合に一つにまとめる場合。
  • クラスからの生成が難しい場合
Builder
複雑なものを作り上げる場合にしようする。まずインターフェースを決める。そして、そのインターフェースをもとに、簡単な操作で作成対象を生成できるように、APIを用意する。
外部から使用するの1APIだが、その内部で複雑なインスタンスを生成する
Abstract Factory
Factoryを外部引数から受け取り、その内容に応じて動的にFactoryの実装クラスのインスタンスを生成する。設定ファイル等で、Factoryメソッドを切り替える場合等に多用する
Bridge
機能の継承と、実装の継承を分けて考えるパターン。機能のクラス階層と、実装のクラス階層は一番上のクラスで委譲を利用して結びつける。委譲を使用して結びつけるので、クラスとクラスの結びつきが弱くなり、実装を容易に換える事ができる。
Strategy
外部から呼べるAPIのインターフェースを定義しておき、その中身をごっそり変える。アルゴリズムをごっそり変えることを考慮して作る場合に有効
Composite
種類の異なる似たデータを同一視する事で、再起を定義する。例えばFileとDirectoryの再起をたどる例を考えるとその例がそのままCompositeパターンとなる。
Decorator
自分のクラスをコンストラクタの引数にとれるようにすることで、飾り枠と中身を同一視する。
JavaのコアAPIのFileReader, BufferdReader, LineNumberReaderなどはDecoratorパターン。機能を必要に応じて追加する場合等に使用できる
Visitor
VisitorがAcceptorを呼び、AcceptorがVisitorを呼ぶ事によって自分自身を呼ぶ(ダブルディスパッチで)再起を行う。データと処理を明確に分ける事が目的。構文木などを操作する場合等によく使用する。
Chain of Responsibility
データを処理するクラスをデータの種類によって複数に分ける。どのクラスを使用して処理するかを呼び出す側が判断するのではなく、クラスチェーンを使用して順番に呼び出し、各クラスが処理できるかを判断する
処理する内容を動的に変更したい場合に、クラスチェーンを変化させる事によって柔軟に条件を変更できる
Facade
ファサードと読む。APIを複雑に呼ばなければいけないものを単純なAPIにまとめてわかりやすくする。
Mediator
イベントドリブンなアプリケーション等で、ボタンを押された場合、各ボタンに対応する処理をそれぞれのリスナーに定義するのではなく、一つのクラスにまとめて書いておくパターン。処理を一カ所にまとめる事によって、処理の流れを追いやすくする
Observer
状態の変化をObserverが監視(または通知)し、処理を1箇所にまとめておくパターン。Observerを変更する事で、処理を変える事が可能。Observerを複数登録する事によって、複数の処理を行わせる事ができる
Observerは監視者という意味だが、実際には通知するようなパターンになる
Memento
undo, redo, history, snapshot等の機能を実現したい場合に、状態をクラスのインスタンスとして保存する。
State
状態をクラスで表現する。また、状態を表すクラスにロジックをもたせる事によって、実行する内容をクラスを変更する事で返る。クラスで表現しない場合と比べて、if文が減る
例えば、朝というクラスの食べるというメソッドはパン、昼というクラスの食べるというメソッドは焼きそば、夜というクラスの食べるというメソッドはステーキとしたとき、状態を朝、昼、夜、で変えておけば、実行するメソッドは常に食べるというメソッド1つになる
Flyweight
再利用可能なインスタンスは使い回す。Singletonパターン等を使用して、インスタンスを使い回す。このスタイルを利用する場合、ガベージコレクションされないので多量のインスタンスが必要になる場合は注意
Proxy
重たい処理を変わりに実行するパターン。本当に必要になるまでは重たい処理を実行せず、本当に必要になった場合に実行する。
例えば、BufferedWriter等がこのパターンを利用している。ディスクに書き込む必要が出るまではメモリ上に1文字1文字書き込んでおき、必要になった段階でディスクに書き込む
Command
1命令を1クラスにする。親クラスにexecute等のメソッドを定義しておき、そのサブクラスで、実装を記述する。全ての命令はクラスとして存在するので、インスタンスを保存しておけば履歴の保存が可能となる。また、クラスを増やせば、処理できる命令が増える。
Interpreter
ミニ言語を実装し、そのミニ言語で処理を記述するパターン。検索エンジン等に使われている検索用の表現等も、このミニ言語を実装している。