java-recipes

ホーム › デザインパターン

デザインパターン

GoF(Gang of Four)デザインパターンの Java 実装サンプル集です。 実務でよく使われるパターンを中心に、Java 8 / 17 / 21 のバージョン別コードで解説します。

DP-02: Builder パターン

コンストラクタの引数が多くなる「テレスコーピング問題」を解決するパターン。HttpRequest や EmailMessage の実装例で名前付き・段階的なオブジェクト構築を学びます。

Builderテレスコーピング問題メソッドチェーン

DP-03: Factory Method パターン

オブジェクトの生成処理をサブクラスに委譲するパターン。Report(PDF / HTML / CSV)の生成例で、依存性の逆転と拡張性を学びます。

Factory Method生成パターン依存性逆転

DP-05: Singleton パターン

インスタンスを1つだけ生成し、グローバルアクセスポイントを提供するパターン。スレッドセーフな実装(ダブルチェックロッキング・enum Singleton)を Java 8 / 17 / 21 で比較します。

Singletonスレッドセーフenum

DP-06: Adapter パターン

既存クラスを変更せず新しいインターフェースに適合させるパターン。java.io.InputStreamReader(InputStream → Reader 変換)が代表例です。

Adapter構造パターンインターフェース変換

DP-08: Composite パターン

単一オブジェクトと複合オブジェクトを同じインターフェースで扱うパターン。ファイルとディレクトリをツリー構造で統一的に操作する例で解説します。

Compositeツリー構造再帰

DP-09: Decorator パターン

継承ではなく委譲で機能を動的に追加するパターン。BufferedInputStream や GZIPOutputStream など java.io の設計に多用されています。

Decorator委譲機能追加

DP-10: Facade パターン

複雑なサブシステムをシンプルな窓口で隠蔽するパターン。メール送信(認証・テンプレート・SMTP・ログ)を1メソッドに統合する例で解説します。

Facadeサブシステム隠蔽シンプルなAPI

DP-12: Proxy パターン

オブジェクトへのアクセスを制御する代理人パターン。仮想プロキシ(遅延ロード)と保護プロキシ(アクセス制御)を Java 8 / 17 / 21 で実装します。

Proxy遅延ロードアクセス制御

DP-13: Chain of Responsibility パターン

リクエストを処理できるハンドラーが見つかるまでチェーンに沿って渡すパターン。ログレベルフィルタリングチェーンで Servlet フィルターの仕組みを理解します。

Chain of Responsibilityハンドラーチェーンフィルター

DP-14: Command パターン

操作をオブジェクト化して Undo/Redo・キューイングを可能にするパターン。テキストエディタの挿入・削除操作を例に、履歴管理の仕組みを解説します。

CommandUndo/Redo操作のオブジェクト化

DP-16: Iterator パターン

コレクションの内部構造を隠してアクセスを統一するパターン。Iterable を実装して for-each ループを使えるカスタムコレクションを作ります。

IteratorIterablefor-each

DP-19: Observer パターン

状態変化を複数のオブザーバーに通知するパターン。イベントリスナーの仕組みを実装から理解します。java.util.Observer は Java 9+ で非推奨になりました。

Observerイベントリスナー通知

DP-20: State パターン

状態に応じて振る舞いを変えるパターン。自動販売機(IDLE→COIN_INSERTED→DISPENSING)の例で、if-else による状態管理の問題点と解決策を学びます。

Stateステートマシン状態遷移

DP-21: Strategy パターン

アルゴリズムをオブジェクト化して実行時に切り替えるパターン。java.util.Comparator はまさに Strategy パターンの実装です。

StrategyComparatorアルゴリズム切り替え

DP-22: Template Method パターン

アルゴリズムの骨組みをスーパークラスで定義し、具体処理をサブクラスに委譲するパターン。HttpServlet の doGet()/doPost() が代表例です。

Template Method抽象クラスホックメソッド