B-Teck!

お仕事からゲームまで幅広く

【デザインパターン】デザインパターンの勉強中メモ 構造に関するパターン

Adapter

利用したいクラスに利用したいメソッドが存在せず、
直接振る舞いを変えることにリスクがあるような場合に使う。
既存のクラスに修正を加えること無く、必要なインターフェースを追加するパターン。
継承を利用する場合と委譲を利用する場合の2通りがある。
継承の場合は、Adapterクラスの中からスーパークラスのメソッドを呼び出すなどして利用する。
委譲の場合は、利用したいクラスのインスタンスを内部で作成し利用したいメソッドを呼び出す。

Bridge

クラスを拡張しやすくするため、実装を呼び出す部分と実際の実装部分を分割するパターン。
拡張された呼び出しクラスは、スーパークラスを経由して実装を呼び出すので実装を意識しない。
拡張された実装クラスは共通のインターフェースを持つことで呼び出し元を意識しない。

お互いを意識しなくなることで、少ないクラスで同じ機能を実現できるようになる

Composite

木構造を伴う再帰的なデータ構造を、操作対象が枝か葉かを意識すること無く扱うパターン。
枝と葉の両方で同じインターフェースを持ち、同じように呼び出すことができるようにする。
枝のメソッドを呼び出した場合は枝全体を操作し、
葉のメソッドを呼び出した場合は自分自身の操作を行う。

Decorator

既存のオブジェクトに機能や振る舞いを動的に追加するパターン。
Decoratorクラスは引数に既存のオブジェクトを取り、拡張機能のみを実装したクラス。
拡張したい機能をDecoratorクラスのメソッドでラップし、
それ以外は実行時に引数で取った既存のオブジェクトのものを利用する。

Facade

複数のクラスの関与する、手順化された処理を一つにまとめ、
共通関数の公開メソッドとして実装するパターン。
実際に利用するクラスを隠蔽し、Facadeクラスのみを呼び出すことでシンプルな実装にできる。

Flyweight

別々の場所で複数回同じインスタンスを使用したい場合に、
同じインスタンスを保持して再利用するパターン。
利用時に生成するコストがインスタンスを使いまわすデメリットを上回ったときとかに使う。
DBアクセスを含む処理を行う場合やインスタンスの生成の数が膨大な場合など。

Proxy

既存のクラスと共通のインタフェースをもつProxyクラスを作成し、
Proxyクラスを経由して実際の処理を呼び出すパターン。
実際の処理を呼び出す前にフックした処理を行いたい場合や、
処理の実行可否を判断したい場合などに、
Proxyクラスのみの修正で対応できるようになる。

Decoratorパターンと類似しているが、
Decoratorパターンは動的に動作を変更することが目的、
Proxyパターンは既存のクラスの責務を減らし、代理できる処理を引き受けることが目的、
という目的の違いがあるので異なる。