デザインパターン(Design Pattern)の概念と種類
デザインパターンとは?
デザインパターンは、ソフトウェアを設計するとき、特定の文脈でよく発生する慢性的な問題が再び発生した場合に再利用できる優れた解決策である。
「車輪の再発明をするな(Don’t reinvent the wheel)」とは、すでに作られてうまく機能しているものを、最初からもう一度作る必要はないという意味である。
デザインパターンの種類
すでに知られているデザインパターンは、次のように23個に分けられている。大きく生成(Creational)、構造(Structural)、振る舞い(Behavioral)の3種類に分類される。 これはGoF(Gang of Four)デザインパターンと呼ばれ、Erich Gamma、Richard Helm、Ralph Johnson、John Vissidesの4人の有名な開発者によって考案された。4人の開発者は「経験」や「内的な蓄積」を<デザインパターン>という形で整理した。この4人をthe Gang of Four、またはGoFと呼ぶ。
生成パターン(Creational Pattern)
オブジェクト生成に関するパターンであり、オブジェクトの生成と組み合わせをカプセル化し、特定のオブジェクトが生成または変更されてもプログラム構造が大きな影響を受けないように柔軟性を提供する。
- 抽象ファクトリメソッド(Abstract Factory Methods): 関連する部品を組み立てて製品を作る。
- ファクトリメソッド(Factory Methods): インスタンス作成をサブクラスに任せる。
- ビルダー(Builder): 複雑なインスタンスを組み立てる。
- プロトタイプ(Prototype): コピーしてインスタンスを作る。
- シングルトン(Singleton): ただ1つのインスタンス。
構造パターン(Structural Pattern)
クラスやオブジェクトを組み合わせて、より大きな構造を作るパターンである。例えば、互いに異なるインターフェースを持つ2つのオブジェクトをまとめて単一のインターフェースを提供したり、オブジェクト同士をまとめて新しい機能を提供したりするパターンである。
- アダプター(Adapter): 一枚かぶせて再利用する。
- ブリッジ(Bridge): 機能の階層と実装の階層を分離する。
- コンポジット(Composite): 入れ物と中身を同一視する。
- デコレーター(Decorator): 装飾と中身を同一視する。
- ファサード(Facade): 簡単な窓口。
- フライウェイト(Flyweight): 同じものを共有して無駄をなくす。
- プロキシ(Proxy): 必要になったら作る。
振る舞いパターン(Behavioral Pattern)
オブジェクトやクラス間のアルゴリズムや責任分配に関するパターンであり、1つのオブジェクトが単独で実行できない作業を複数のオブジェクトにどのように分配するか、またその際にオブジェクト間の結合度を最小化することに重点を置く。
- 責任連鎖(Chain of Responsibility): 責任を次へ渡す。
- コマンド(Command): 命令をクラスにする。
- インタプリタ(Interpreter): 文法規則をクラスで表現する。
- イテレーター(Iterator): 1つずつ数える。
- メディエーター(Mediator): 相手はカウンセラー1人だけ。
- メメント(Memento): 状態を保存する。
- オブザーバー(Observer): 状態の変化を通知する。
- ステート(State): 状態をクラスとして表現する。
- ストラテジー(Strategy): アルゴリズムを丸ごと入れ替える。
- テンプレートメソッド(Template Methods): 具体的な処理をサブクラスに任せる。
- ビジター(Visitor): 構造の中を巡回しながら処理を行う。
Java例の出典
参考
- [Design Pattern] デザインパターンの種類
- すべてのソフトウェア開発者が知るべきデザインパターン
- すべてのソフトウェア開発者が知るべきデザインパターン2
- Javaデザインパターンの理解 - GoF Design Pattern[1-11]