デザインパターンの効用
デザインパターンとは、プログラムの「ひな形」「テンプレート」のことです。過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し、名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したものです。
優れたデザインパターンを参照することにより、次のようなメリットがあります。
- 優れた技術者により作成されているので、それを参考にすることにより、ベストプラクティスを体得できる。
- 構造化プログラミングやオブジェクト指向プログラミングで作成されており、再利用性の高いコードを作ることができる。
- 著名なデザインパターンは、エンジニアが共通に理解しているので、その概念や用語が共通言語となりコミュニケーションが容易になる。
GoF(Gnag of Four)代表的なデザインパターン
代表的なデザインパターンに、「オブジェクト指向における再利用のためのデザインパターン」という本で広く知られるようになったGoF(Gnag of Four)があります。
GoFは、「生成」や「構造」、「振る舞い」の3つに分類して、23のパターンがあります。
それぞれのパターンについて、次の内容を記述しています。
・文章での例題
・UMLのクラス図(複数のサブクラス=下位モジュール)
・Java でのサンプルコード
生成に関するパターン
- Abstract Factory(抽象的な工場)
関連する部品(オブジェクト群)の具体的な実装には注目せず、インターフェースだけを用いて、一つの製品(システム)を生成する。
- Builder(構築)
構造を持ったインスタンスについて専用のクラスを用意し、それを組み立てて大きなオブジェクトを生成する。
- Factory Method(工場)
インスタンス生成のための枠組みと、インスタンス生成のクラスを分離
インスタンスの作り方をスーパークラスで定め、具体的な生成処理はサブクラス側で行う。
クラスを増やし、機能を拡張する際に使用
- Prototype(原型)
インスタンスをコピーして新しいインスタンスを作成(クローンの作成)
同じクラスで複数のオブジェクトを生成する際に作業を効率化
- Singleton(単一要素)
1つのクラスから1つのインスタンスだけを生成するように制限
プログラムの構造に関するパターン
- Adaptor(適合)
「すでに提供されているもの」と「必要なもの」との間のズレを埋める
「継承」あるいは「委譲」を利用する。
- Bridge(橋渡し)
機能を拡張するクラスと実装するクラスを分離し、その間の橋渡しを行う
継承元のスーパークラスの抽象メソッドを適切に実装したり、サブクラスで機能を拡張する際に利用
- Composite(複合物)
フォルダ内のサブフォルダとファイルの関係のように再帰的な構造を作る
- Decorator(飾り付け)
オブジェクトに対して機能を次々に追加する
- Facade(窓口)
複数のクラスを適切に制御するための「窓口」役のクラスを作成し、その「窓口」から各クラスへ指令を出す
- Flyweight(フライ級→軽量化)
小さなオブジェクトを数多くロードする必要がある場合にインスタンスを可能な限り共有させて、無駄にインスタンスを作成せずに、メモリ使用量削減などの効率的に処理を行う
- Proxy(代理)
処理の一部を「代理」に肩代わりさせ、重い処理は必要な時点まで遅らせることが可能
オブジェクトの振る舞いに関するパターン
- Chain of Responsibility(たらい回し)
あるクラスのオブジェクトが処理可能なら処理を行い、処理不可の場合は他のクラスのオブジェクトに送って処理を実行
複数のオブジェクトを鎖で繋いでおき、そのオブジェクトの鎖を順次渡り歩いて目的のオブジェクトを決定する方式
- Command(命令)
命令を表すクラスをインスタンスという「モノ」で管理
- Interpreter(通訳)
何らかの形式で書かれたファイルの中身を、「通訳」の役目を果たすプログラムで解析・表現する方式
- Iterator(繰返)
複数のオブジェクトを順番に行い全体の処理を行う
- Mediator(相談役)
唯一の相談役に報告し、相談役を通して行動を起こす。相談役は、複雑なオブジェクトの状態を把握し、適切な判断と支持を行う
- Memento(記念品)
インスタンスの状態を表す役割を設け、インスタンスの状態の保存と復元を行う
- Observer(観察者)
状態変化に応じた処理を記述する際に、観察者に対して通知が行われる方式
- State(状態)
状態をクラスとして表現し、クラスを切り替えることで状態の変化を表す
- Strategy(戦略≒アルゴリズム)
アルゴリズムの実装部分が交換可能で、変更を容易にする
- Template Method(テンプレート)
スーパークラスで処理の枠組み(テンプレート)を定め、サブクラスでその具体的な内容を定義する
- Visitor(訪問者)
データ構造と処理を分離
データ構造を渡り歩く「訪問者」を表すクラスを用意し、そのクラスが処理を実施
新しい処理を追加したい場合は新しい「訪問者」を作成
データ構造側は必要に応じて「訪問者」を受け入れる