ストーリー
デザインパターンの歴史
1994年、Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides の4人(Gang of Four = GoF)が著書『Design Patterns: Elements of Reusable Object-Oriented Software』で23のデザインパターンを体系化しました。
これらのパターンは「発明」されたものではなく、多くのソフトウェアプロジェクトで繰り返し使われていた解決策を「発見」し、名前をつけたものです。
パターンを学ぶ意義
1. 共通の語彙を持てる
// パターンを知らない場合
「このオブジェクトの生成を、条件によって別のクラスに切り替えたいんですが、
生成ロジックを呼び出し側から隠蔽して、インターフェースだけ公開する形で......」
// パターンを知っている場合
「ここは Factory Method パターンを使おう」
チーム全員がパターンの名前と意味を共有していれば、設計の議論が格段に効率的になります。
2. 車輪の再発明を避けられる
同じ問題を先人が何十年も前に解決しています。その知恵を活用しない手はありません。
3. SOLID原則の具体的な適用例
デザインパターンの多くは、SOLID原則を実現するための具体的な構造です。
| パターン | 関連するSOLID原則 |
|---|---|
| Strategy | OCP, DIP |
| Factory Method | OCP, DIP |
| Observer | OCP, SRP |
| Decorator | OCP, SRP |
| Adapter | ISP, DIP |
GoF 23パターンの分類
生成パターン(Creational Patterns)— 5つ
オブジェクトの生成に関するパターンです。
| パターン | 一言説明 |
|---|---|
| Factory Method | サブクラスに生成を委ねる |
| Abstract Factory | 関連するオブジェクト群をまとめて生成する |
| Builder | 複雑なオブジェクトを段階的に構築する |
| Singleton | インスタンスを1つだけに保証する |
| Prototype | 既存オブジェクトをコピーして生成する |
構造パターン(Structural Patterns)— 7つ
クラスやオブジェクトの組み合わせに関するパターンです。
| パターン | 一言説明 |
|---|---|
| Adapter | 互換性のないインターフェースを接続する |
| Bridge | 抽象と実装を分離する |
| Composite | 木構造を統一的に扱う |
| Decorator | 動的に機能を追加する |
| Facade | 複雑なサブシステムに簡単な窓口を提供する |
| Flyweight | 共有でメモリを節約する |
| Proxy | アクセスを制御する代理オブジェクト |
振る舞いパターン(Behavioral Patterns)— 11つ
オブジェクト間の通信と責任分担に関するパターンです。
| パターン | 一言説明 |
|---|---|
| Chain of Responsibility | 処理を連鎖的に委譲する |
| Command | 操作をオブジェクトとして表現する |
| Iterator | 要素を順番にアクセスする |
| Mediator | オブジェクト間の通信を仲介する |
| Memento | 状態を保存・復元する |
| Observer | 状態変化を通知する |
| State | 状態に応じて振る舞いを変える |
| Strategy | アルゴリズムを交換可能にする |
| Template Method | 処理の骨格を定義し、詳細をサブクラスに委ねる |
| Visitor | データ構造と処理を分離する |
| Interpreter | 文法を定義し解釈する |
パターンの構造を読むコツ
各パターンは以下の要素で説明されます。
| 要素 | 説明 |
|---|---|
| 名前 | パターンの識別名(共通語彙) |
| 目的 | どんな問題を解決するか |
| 動機 | なぜこのパターンが必要か |
| 構造 | クラス図やオブジェクト図 |
| 参加者 | 登場するクラスやインターフェース |
| 適用可能性 | いつ使うべきか |
| 結果 | メリットとデメリット |
パターンを使う際の注意
高橋アーキテクトのアドバイス:
「パターンを学ぶと、何でもパターンで解決したくなる。これを”ゴールデンハンマー症候群”と呼ぶ。パターンは目的ではなく手段だ。問題があって初めてパターンを適用する。パターンを使いたいがために問題を作ってはいけない」
| やるべきこと | やってはいけないこと |
|---|---|
| 問題を分析してからパターンを選ぶ | パターンありきで設計する |
| チームで語彙として共有する | パターン名でマウントを取る |
| 必要に応じてパターンを組み合わせる | 23パターン全部を1つのプロジェクトで使う |
| シンプルな解決策で十分なら使わない | 単純な問題を過剰に抽象化する |
まとめ
| ポイント | 内容 |
|---|---|
| GoFデザインパターン | 繰り返し使われる設計の型を体系化したもの |
| 3つの分類 | 生成・構造・振る舞い |
| 学ぶ意義 | 共通語彙、再利用、SOLID の具体例 |
| 注意点 | 手段であり目的ではない |
チェックリスト
- デザインパターンの歴史と目的を理解した
- 3つの分類(生成・構造・振る舞い)を把握した
- パターンを使う際の注意点を理解した
次のステップへ
次から具体的なパターンを学んでいきます。まずは生成パターンの Factory Method と Abstract Factory からです。
推定読了時間: 25分