Javaを鍛える|デザインパターン全23回 #1

総論:GoF23パターンの地図

  • Java
  • デザインパターン
  • GoF
  • Javaを鍛える

📋 この記事の目次
  1. デザインパターンとは何か(改めて)
  2. GoFの3分類:生成・構造・振る舞い
  3. 23パターン一覧:TicketCraftでの対応
  4. この連載の読み方
  5. 🎓 理解度テスト

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問。