総論:GoF23パターンの地図
OOP基礎編・Java8モダン文法編・設計編を経て、TicketCraftはずいぶん整理されたコードベースになりました。しかし、実際のソフトウェア開発に「これで完成」という終わりはありません。機能を追加するたびに、似たような設計上の悩みが繰り返し出てきます。
「設定オブジェクトを複数箇所で作ってしまい、状態がバラバラになった」 「通知手段を追加するたびに、呼び出し側のコードをあちこち書き換えている」 「チケットの検索条件を渡す関数の引数が、気づけば10個近くになっていた」
こうした 「よくある設計の悩みと、その定番の解決策」 を体系立ててまとめたものが、GoF(Gang of Four、4人の著者の頭文字)デザインパターンです。今回から23回にわたって、TicketCraftの機能追加・保守を題材に、1パターンずつ実際に手を動かしながら学んでいきます。
デザインパターンとは何か(改めて)
デザインパターンは、特定のプログラミング言語の文法とは別の、「設計の型」 です。同じ悩みに何度も遭遇してきた先人たちが、「この形にしておけば大抵うまくいく」という解決策を、名前をつけて整理したものだと考えてください。
名前がついていることには実用的な価値があります。「ここはFactory Methodで整理できそう」とチーム内で言うだけで、具体的な設計方針が一瞬で共有できるようになります。
GoFの3分類:生成・構造・振る舞い
GoFの23パターンは、次の3つのグループに分類されます。
| 分類 | 何についてのパターンか | 一言で言うと |
|---|---|---|
| 生成に関するパターン | オブジェクトの作り方についての工夫 | 「どう作るか」を整理する |
| 構造に関するパターン | クラスやオブジェクトの組み合わせ方についての工夫 | 「どう組み合わせるか」を整理する |
| 振る舞いに関するパターン | オブジェクト同士の役割分担・やり取りの仕方についての工夫 | 「どう連携するか」を整理する |
この連載でも、この3分類の順番でパターンを紹介していきます。
23パターン一覧:TicketCraftでの対応
それぞれのパターンを、TicketCraftのどんな場面に当てはめて学んでいくかの予告表です。
生成に関するパターン(5種)
| パターン | TicketCraftでの題材 |
|---|---|
| Singleton | システム全体で共有する設定・ロガー |
| Factory Method | チケット種別(バグ/要望/問い合わせ)ごとの生成分離 |
| Abstract Factory | 通知チャネル一式(メール/Slack、SMS/ポケベル)の差し替え |
| Builder | 複雑な「検索条件」オブジェクトの段階的構築 |
| Prototype | よく使うチケットテンプレートの複製 |
構造に関するパターン(7種)
| パターン | TicketCraftでの題材 |
|---|---|
| Adapter | 社外チケットサービスAPIとの接続変換 |
| Bridge | 出力形式(画面/PDF/Slack)とチケット種別の分離 |
| Composite | プロジェクト→サブタスク→チケットの階層 |
| Decorator | 一覧表示への期限超過バッジ等の後付け装飾 |
| Facade | 「作成+通知+履歴記録」の簡易窓口 |
| Flyweight | 大量のラベル(タグ)オブジェクトの共有 |
| Proxy | 添付ファイルの遅延読み込み |
振る舞いに関するパターン(11種)
| パターン | TicketCraftでの題材 |
|---|---|
| Chain of Responsibility | 承認フロー(担当者→リーダー→マネージャー) |
| Command | ステータス変更のUndo対応 |
| Interpreter | 簡易検索クエリの解釈 |
| Iterator | 新しい順/優先度順などの巡回方法の切り替え |
| Mediator | フィルタ・一覧・詳細パネル間のやり取りの集約 |
| Memento | 編集内容のスナップショット保存・Undo |
| Observer | チケット更新時の担当者・ウォッチャーへの通知 |
| State | ステータスごとの操作制御 |
| Strategy | 自動割り当てロジックの切替 |
| Template Method | チケット種別ごとのクローズ処理の共通フロー |
| Visitor | チケット階層への集計レポート/CSV出力の後付け |
🧓 ベテランの現場コラム 新人のうちは「23個も覚えられない」と身構えてしまいがちですが、実務で頻繁に使うのは、この中のほんの数個です。「名前を覚えること」より「今困っている状況に当てはまる型がないか思い出せること」 の方がずっと重要です。この連載も、丸暗記ではなく「あの記事で読んだ状況に似ている」と思い出せる状態を目指して書いています。
この連載の読み方
- 各回はBefore(パターン適用前で困っている状態)→After(パターン適用後) という2段構成で、1本ずつ独立して読めます
- 順番通りに読む必要はありません。今抱えている悩みに近いパターンから読んでも構いません
- 「生成」「構造」「振る舞い」というグループの区切りは、パターンの性質を理解する手がかりとして使ってください
- 掲載しているコードはすべてTicketCraftというこの連載オリジナルの題材で書いており、実際にコンパイル・実行して動作を確認したものです
デザインパターンをさらに体系的に学びたい方には、結城浩著『Java言語で学ぶデザインパターン入門』(SBクリエイティブ)もおすすめです。定番の解説書として長く読まれている一冊で、本連載とは異なる題材・切り口でパターンを学べます。
🎓 理解度テスト
学んだ内容を確認しましょう。全3問。