🔥

オブジェクト指向における再利用のためのデザインパターンの概要とパターンカタログ

2022/05/16に公開

オブジェクト指向における再利用のためのデザインパターン

オブジェクト指向プログラミングを行うにあたり再利用性や柔軟性、拡張性を上げるために考案された設計手法に名前をつけたものです。デザインパターンは多くの問題に対して柔軟に適応できるように設計されています。そのため、デザインパターンを元に状況に応じた実装を行うことが可能になります。

オブジェクト指向プログラミングにおけるデザインパターンは書籍『オブジェクト指向における再利用のためのデザインパターン』(通称GoF本)によって紹介されました。ここでは各パターンの詳細には踏み込まず簡単な概要と説明のみとさせていただきます。この書籍は今も尚多くの方に読まれている本ですのでぜひ購入してみてください。

GoF本にて紹介されている原理

GoF本にはオブジェクト指向設計のための原理が2つ紹介されています。
1つ目は抽象クラス(またはインターフェース)に関する原理です。

インタフェースに対してプログラミングするのであって、実装に対してプログラミングするのではない。

2つ目はコンポジションに関する原理です。

クラス離承よりもオブジェクトコンポジションを多用すること。

これらの記述通りデザインパターンには多くの抽象クラス(またはインターフェース)が登場し、コンポジションも多用されています。

デザインパターンカタログ

生成に関するデザインパターン

生成に関するデザインパターンはオブジェクトの生成を独立して提供し、生成するために必要な関連や規則などの詳細を呼び出し元から隠蔽することを可能にします。

名称 簡単な説明
Abstract Factory 互いに依存したり関連するオブジェクトの生成を整合性を保って安全に生成するパターン
Builder 生成が複雑な複合化されたオブジェクトについて、作成過程を隠蔽することで同じ作成過程で表現の異なる内部形式のオブジェクトを作成できるようにするパターン
Factory Method 具体的なクラスの生成をサブクラスに委任するパターン
Prototype 原型となるオブジェクトを元に複製を行うパターン
Singleton インスタンス可能な数を制限(基本的には1つだけ)できるようにするパターン

構造に関するデザインパターン

構造に関するデザインパターンは、クラスやオブジェクを合成する機能を提供しより大規模な構造を構築することを可能にします。

名称 簡単な説明
Adapter 互換性のないインタフェースを持つクラス同士の接続を行えるようにするパターン
Bridge あるクラスにおける機能拡張と実装を分離して独立して管理できるようにするパターン
Composite 個々のオブジェクトを同一視することにより、再帰的な構造を表現し処理できるようにするパターン
Decorator あるオブジェクトに対して動的な機能追加を提供するパターン
Facade サブシステム内の機能を利用、または接続するためのインターフェースを提供するパターン
Flyweight インスタンスを適切に使い回せるようにするパターン
Proxy 特定のオブジェクトへのアクセスや処理を代理オブジェクトで行うようにするパターン

振る舞いに関するデザインパターン

振る舞いに関するデザインパターンは、アルゴリズムや振る舞い、状態をオブジェクト間で分解し責任を分けることで再利用性を高めたり、制御の局所化を可能にします。

名称 簡単な説明
Chain of Responsibility 複数のオブジェクトを鎖状につなぎ、その中の任意のオブジェクトがある要求を処理するまで、順次その鎖に沿って要求を受流すパターン
Command 命令・操作をオブジェクトで表現し、そのオブジェクトを切り替えることで操作の切り替えを実現するパターン
Interpreter 規則のある文章を解析し得られた手順に基づいて処理を行うパターン
Iterator 集約したオブジェクトを列挙する手段を提供するパターン
Mediator 絡み合った複数のオブジェクト間の関係を「仲介者」を介して処理を行う様にすることでシンプルなインタフェースを提供するパターン
Memento データ構造に対する操作内容や状態を記録しておき、操作の再実行や状態の復元が行えるようにするパターン
Observer あるオブジェクトの変化を依存するオブジェクトに自動的に知らせる仕組みを提供するパターン
State 状態を表すオブジェクトを用意し、内包するその状態オブジェクトを切り替えることにより、処理内容を変更するパターン
Strategy 一連のアルゴリズムをカプセル化し、動的なアルゴリズムの切替えを可能にするパターン
Template Method スーパークラスで処理の枠組みを定義し、処理の詳細はサブクラスで定義するパターン
Visitor データ構造とそれに対する処理を分離するパターン

参考文献

Discussion