Javaデザインパターン:コード内の問題を選ぶと、動く短いJavaファイルでパターンが手に入ります

GoF全23パターンをJava 21の短いコードと実行結果で解説し、場面別早見表と答え付きの面接質問69問も収録しています。

Javaデザインパターン:コード内の問題を選ぶと、動く短いJavaファイルでパターンが手に入ります
このページで得られる結果の例

無料で試す

使い方
  1. 下の無料版に、ご自分の数字や内容を入力します。
  2. 結果はこのページですぐに表示されます。
  3. さらに必要なら、完全版で「得られるもの」の内容が追加されます。

得られるもの: 完全版 →

ReadyStack

Javaデザインパターン · GoF全23種

  • 全23パターン、それぞれ短いファイル1つ。 どのGoFパターンも、22-56行(中央値32行)のJava 21ファイル1つです。record、sealed型、パターンマッチングを使い、ゲッターなどの定型コードは書きません。
  • 34件のテストすべてが、Java 21とJava 25で通ります。 展開して mvn test を実行してください。JUnit 5のテストクラス23件、失敗0件です。各例の下に表示される出力は、そのファイルの実際の出力です。
  • 買い切りです。サブスクリプションはありません。 各パターンはここですべて無料で読めます。完全版キット(Mavenプロジェクト、30ページのPDF、69問の演習、AIルール)は買い切りです。

完全版キット $19 買い切り · コードと解説は英語です · 無料版か完全版か?

どのデザインパターンをいつ使うか

自分のコードに合う文を探し、パターンをクリックしてください。

コードの状況パターン使わない場合行数
生成系
共有オブジェクトが1つだけ必要で、複製すると不具合になるテストで差し替える必要があるもの(データベース、時計など)には使わないでください。そのようなものは代わりに引数として渡してください。22
基底クラスが処理の流れを進め、どのオブジェクトを作るかはサブクラスが決める作る製品のクラスが1つだけの場合は不要です。コンストラクターか静的ファクトリーで十分です。32
複数のオブジェクトを同じ系統から作る必要がある(地域、テーマ、データベースなど)製品の型が1種類だけの場合や、系統が混ざることがない場合は不要です。意味なくクラスが増えるだけです。29
任意項目が多い。または、誰かが見る前にオブジェクトが正しい状態である必要がある必須の項目が2-3個だけのrecordには不要です。標準のコンストラクターのほうが分かりやすいです。37
新しいオブジェクトは、設定済みのひな形をコピーして作るオブジェクトの生成コストが低い場合は不要です。また、変更可能なフィールドの浅いコピーに注意してください。28
構造系
編集できないクラスのインターフェースが合わない両側のコードを自分で管理しているなら不要です。変換役を追加する代わりに、インターフェースを変更してください。28
2つの要素がそれぞれ独立に変化し、サブクラスが増えていく(種類×チャネル)2つの軸のどちらかにバリエーションが1つしかない場合は不要です。31
1つの要素とまとまりを、同じように扱いたい木構造データがフラットな場合や、末端とまとまりに必要な操作が大きく異なる場合は不要です。25
任意の振る舞いを、実行時に好きな組み合わせで追加したい追加機能の適用順が結果に影響してはならない場合は不向きです。ラッパーは積んだ順に適用されます。30
呼び出し側で、同じ複数ステップの手順が複数のクラスに繰り返し書かれているすべてのロジックを隠す場所としては使わないでください。ファサードは調整役であり、何でも持つゴッドクラスになってはいけません。46
同じ重いデータを持つオブジェクトが何千も存在するオブジェクトの数が少ない場合や、共有できる部分が小さい場合は不要です。得るものが少ないのにファクトリーを追加することになります。32
呼び出し側を変えずに、遅い・遠隔にある・保護された対象へのアクセスを制御したい追加の層が、呼び出し側が対処すべき失敗を隠してしまう場合は不向きです(「ローカル」に見えるインターフェースの裏に隠れたネットワークエラーなど)。33
振る舞い系
リクエストを、処理できるハンドラーが見つかるまで順に渡していく必ず1つの決まったハンドラーだけが適用される場合は不要です。直接呼び出したほうが分かりやすく、デバッグもしやすいです。26
操作を、キューに入れる・記録する・再試行する・取り消す必要があるキューに入れたり取り消したりしない一度きりの呼び出しには不要です。余計な手間が増えるだけです。44
ユーザーが、評価しなければならない小さな言語でルールや数式を書く大規模または頻繁に変わる言語には不向きです。パーサージェネレーター(ANTLR)や既存の式エンジンを使ってください。56
保存方法を知らなくても、要素を順にたどりたいStreamや既存のコレクションで必要なものがすでに得られる場合は不要です。30
多くのオブジェクトが互いに参照し合い、依存関係が絡み合っているメディエーターが肥大化して、すべてのロジックを抱え込むゴッドオブジェクトになる場合は不向きです。37
フィールドを外に公開せずに、オブジェクトの状態を保存・復元したいスナップショットが大きく頻繁に作られる場合は不向きです。代わりに変更内容(コマンド)を保存してください。36
1つのオブジェクトが変わったとき、ほかのオブジェクトが反応する必要がある反応を厳密な順序で、または1つのトランザクション内で行う必要がある場合は不向きです。その場合は直接呼び出してください。30
振る舞いが状態によって変わり、どのメソッドも状態で分岐している状態が2-3個で単純なルールの場合は不要です。列挙型とswitchで十分です。42
同じ仕事を行う複数の方法があり、実行時に入れ替えて選びたい変わることのないアルゴリズムが1つだけの場合は不要です。24
同じ順序の手順で、一部の手順だけが異なる手順が自由に変わる場合は不向きです。継承を強いる代わりに、ストラテジーを渡してください。34
型の定義を変えずに、決まった型の集合に新しい操作を加えたい型の種類が頻繁に変わる場合は不向きです。新しい型を追加するたびに、すべてのビジターを修正する必要があります。52

デザインパターンの面接質問(69問、短い答え付き)

パターンごとに3問ずつです。まず声に出して答えてから、答えを開いてください。

シングルトン 3問
Javaで列挙型が最も安全なシングルトンなのはなぜですか?
JVMは定数を1回だけ、スレッドセーフに作ります。列挙型はシリアライズやリフレクションによっても2つ目を作れません。
`instance == null` を確認するだけで、ロックをしない遅延初期化の何が問題ですか?
2つのスレッドが両方ともnullを見て、2つのインスタンスを作ってしまうことがあります。ホルダークラス、列挙型、またはvolatileフィールドに対するダブルチェックロッキングが必要です。
なぜシングルトンはアンチパターンと呼ばれるのですか?
隠れたグローバル状態だからです。呼び出し側はそれを明示せずに依存し、テストで差し替えることもできません。代わりに、オブジェクトを引数で渡してください(依存性の注入)。
ファクトリーメソッド 3問
ファクトリーメソッドと、List.of() のような静的ファクトリーメソッドの違いは?
GoFのファクトリーメソッドは、サブクラスがオーバーライドして変更できるインスタンスメソッドです。静的ファクトリーは、コンストラクターを隠す固定のメソッドです。
ファクトリーメソッドと抽象ファクトリーの違いは?
ファクトリーメソッドは、継承を通じて製品を1つ作ります。抽象ファクトリーは、関連する製品のまとまり全体を作るオブジェクトです。
これはSOLIDのどの原則を支えていますか?
オープン・クローズドの原則:新しいチャネルは新しいサブクラスで追加し、既存の notify() のコードは編集しません。
抽象ファクトリー 3問
抽象ファクトリーの弱点は何ですか?
新しい製品の型を追加するには、インターフェースとすべてのファクトリーにメソッドを追加する必要があります。
使う具体的なファクトリーはどう選びますか?
起動時に一度だけ(設定ファイルまたは依存性の注入で)選びます。残りのコードはインターフェースだけを見ます。
抽象ファクトリーは、ファクトリーメソッドを使って作れますか?
はい。ファクトリーの各 create メソッドは、多くの場合、サブクラスが実装するファクトリーメソッドになります。
ビルダー 3問
セッターだけではだめなのですか?
セッターを使うと、作りかけで変更可能なオブジェクトが外から見えてしまいます。ビルダーは、build() が検証した後でのみオブジェクトを渡します。
ビルダーではどこで検証しますか?
複数の項目にまたがるルール(注文には商品が必要、など)は build() で、常に成り立つルールは record のコンパクトコンストラクターで検証します。
ビルダーと、`with` メソッドを持つ record の違いは?
record は小さな不変の値に向いています。ただし、任意の部品が多い場合や段階的に組み立てる場合は、ビルダーのほうが適しています。
プロトタイプ 3問
浅いコピーと深いコピーの違いは?
浅いコピーは内部のオブジェクト(同じリストなど)を共有します。深いコピーは内部のオブジェクトもコピーするため、コピーへの変更が元に伝わることはありません。
多くのチームが Cloneable を避けるのはなぜですか?
clone() はコンストラクターを経由せず、Object を返し、チェック例外を投げ、デフォルトでは浅いコピーを行います。明示的な copy() やコピーコンストラクターのほうが分かりやすいです。
プロトタイプのレジストリとは何ですか?
名前付きの既製オブジェクト(ひな形)を登録した対応表です。呼び出し側は、ゼロから作る代わりにこれをコピーします。
アダプター 3問
アダプターとファサードの違いは?
アダプターは、既存のインターフェースを別のインターフェースに合わせます。ファサードは、多くのクラスの上に新しい、より単純なインターフェースを用意します。
オブジェクトアダプターとクラスアダプターの違いは?
オブジェクトアダプターは古いオブジェクトを保持します(コンポジション。Javaでの標準的な方法)。クラスアダプターはそれを継承しますが、Javaでは継承できるクラスは1つだけです。
アダプターとデコレーターの違いは?
アダプターはインターフェースを変えて振る舞いはそのままにします。デコレーターはインターフェースをそのままにして振る舞いを追加します。
ブリッジ 3問
M種類とNチャネルには、クラスがいくつ必要ですか?
ブリッジなら M + N ですが、サブクラスですべての組み合わせを作ると M × N になります。
ブリッジとアダプターの違いは?
ブリッジは、二つの側を独立して拡張できるように最初から設計するものです。アダプターは、既存のものを合わせるために後から追加します。
ブリッジとストラテジーの違いは?
どちらもインターフェースを持つオブジェクトを使うので、コードは似ています。ブリッジは構造を長期的に二つに分けるもの、ストラテジーはアルゴリズムを一つ入れ替えるものです。
コンポジット 3問
子要素を管理するメソッド(add/remove)はどこに置きますか?
グループ側だけに置く(型安全)か、共通インターフェースに置く(統一的だが、葉は拒否しなければならない)か、どちらかを選び、トレードオフを明記してください。
sealed インターフェースはコンポジットにどう役立ちますか?
コンパイラは種類が Product と Bundle だけだと分かるので、それに対する switch は網羅性がチェックされます。
深い階層のコンポジットにはどんなリスクがありますか?
再帰の深さと循環:自分自身を含むバンドルは、ガードしない限り無限ループになります。
デコレーター 3問
デコレーターと継承の違いは?
継承は追加機能をコンパイル時に固定しますが、デコレーターは新しいクラスを作らずに実行時に組み合わせます。
デコレーターとプロキシの違いは?
形は同じです。デコレーターは呼び出し側が求める振る舞いを追加し、プロキシは同じオブジェクトへのアクセスを制御します(キャッシュ、遅延読み込み、セキュリティ)。
ラッパーの順序は重要ですか?
はい。このキットの1000セントの商品では、クーポン→速達の順で 1899、速達→クーポンの順で 1800 になります(どちらもテスト済み)。
ファサード 3問
ファサードは、呼び出し元がサブシステムを直接使うのを防ぎますか?
いいえ。簡単な入口を提供するだけで、上級者は今まで通り部品を直接使えます。
ファサードとメディエーターの違いは?
ファサードは一方向です。クライアントがそれを呼び出し、それが部品を呼び出します。メディエーターは双方向で、部品同士がそれを介して通信します。
このキットのファサードは、どんなバグを防いでいますか?
支払いが拒否されたときに、確保した在庫を解放し忘れることです。テストでは、拒否後にランプが1個残っていることを確認しています。
フライウェイト 3問
共有される(内部状態の)部分には、どんな条件が必要ですか?
全員が同じオブジェクトを見るので、変更不可(イミュータブル)でなければなりません。
`Integer a = 127, b = 127; a == b` が true になり得るのに、128 の場合は false になるのはなぜですか?
Integer.valueOf は -128〜127 をキャッシュ(フライウェイトのプール)するので、127 は同じオブジェクトになり、128 は新しいオブジェクトになります。比較には equals() を使ってください。
フライウェイトとシングルトンの違いは?
シングルトンはクラスのインスタンスを一つだけ持つものです。フライウェイトは共有インスタンスのプールで、異なる値ごとに一つずつ持ちます。
プロキシ 3問
プロキシの種類を4つ挙げてください。
仮想(遅延生成)、リモート(別の場所にあるオブジェクトを代理)、保護(アクセスチェック)、キャッシュ/スマート参照。
Spring の @Transactional はこのパターンをどう使っていますか?
Spring は Bean をプロキシで包み、実際のメソッド呼び出しの前後でトランザクションを開始・コミットします。
自己呼び出しで @Transactional が効かないのはなぜですか?
this.method() は、プロキシではなく実オブジェクトを直接呼び出すため、プロキシの追加処理が実行されません。
責任の連鎖 3問
どのハンドラーも要求を処理しなかった場合はどうなりますか?
決めておく必要があります。デフォルト(ここでは 'board review')、例外、または空の Optional のいずれかです。決して黙って失敗させないでください。
責任の連鎖とデコレーターの違いは?
デコレーターは必ずラップした対象を呼び出します。連鎖のハンドラーは要求を処理して、次に渡さないこともあります。
Java 8 以降は、連鎖をどう短く書けますか?
ハンドラーは Optional を返すラムダにでき、このキットのように then() などのデフォルトメソッドでつなげられます。
コマンド 3問
コマンドパターンで元に戻す(undo)機能はどう実装しますか?
実行したコマンドを一つずつスタックに積みます。undo では最後のものを取り出し、その undo() を呼び出して、execute() が変更した内容を元に戻します。
コマンドとストラテジーの違いは?
ストラテジーは一つの仕事をどうやるか(たとえば並べ替え順)です。コマンドは何かをするよう求める要求で、多くは自分のデータと undo を持ちます。
Clear が古いテキストを保存しているのはなぜですか?
クリアすると情報が失われます。undo には「変更前」の値が必要なので、コマンドがそれを保持します(小さなメメント)。
インタプリター 3問
終端式と非終端式とは何ですか?
終端式は葉(数値や変数名)、非終端式は他の式を組み合わせたもの(Add、Mul)です。
Java 21 でインタープリターはどのように短くなりますか?
文法には record の sealed インターフェースを使い、評価には record パターンを使った switch を一つ書きます。コンパイラがすべてのケースを扱っているかを確認します。
演算子の優先順位はどこで決まりますか?
パーサーの文法で決まります。product は sum の中で解析されるので、'2 + 3 * 4' は Add(2, Mul(3, 4)) = 14 になります。
イテレーター 3問
フェイルファストなイテレーターとは何ですか?
ArrayList のイテレーターは、反復中にリストが変更されると(イテレーター自身を通した変更を除き)ConcurrentModificationException を投げます。
最後まで来たとき next() は何をしなければなりませんか?
Iterator の契約どおり、NoSuchElementException を投げます(このキットでテスト済み)。
内部イテレーションと外部イテレーションの違いは?
外部イテレーションは、呼び出し側が next() で要素を取り出します。内部イテレーションは、コレクションが要素をラムダに渡します(forEach、ストリーム)。
メディエーター 3問
メディエーターとオブザーバーの違いは?
オブザーバーは一つの対象の変更を購読者へ一斉に通知します。メディエーターは対等な相手同士の双方向のやり取りを一箇所に集約します。
メディエーターの主なリスクは何ですか?
調整のロジックがすべて一つのクラスに集まり、非常に大きくなることがあります。ユースケースごとに分割してください。
現実世界の例でメディエーターを一つ挙げてください。
空港の管制塔です。航空機は互いではなく、管制塔と交信します。
メメント 3問
三つの役割は何ですか?
オリジネーター(カート。スナップショットを作成・読み込みする)、メメント(スナップショット)、ケアテイカー(それを保存するだけの履歴)。
スナップショットはなぜリストをコピーしなければなりませんか?
そうしないと、後でカートを変更したときに「保存済み」の状態まで変わってしまいます。List.copyOf で変更不可にします(テスト済み)。
undo のためのメメントとコマンドの違いは?
メメントは状態全体を保存します(単純だがメモリを多く使う)。コマンドは各変更を逆にする方法を保存します(メモリは少ないがコードは増える)。
オブザーバー 3問
オブザーバーはどんなメモリリークを起こしますか?
対象はリスナーへの強い参照を保持します。購読解除されないと、ガベージコレクションされることがありません(放置されたリスナー)。
プッシュ型とプル型の違いは?
プッシュ型は、イベントと一緒に新しいデータを送ります(ここでは Status)。プル型は「変更された」とだけ伝え、リスナーが対象に問い合わせます。
java.util.Observable が非推奨になったのはなぜですか?
インターフェースではなくクラスなので継承しなければならず、シリアライズもできず、イベントの定義も曖昧だからです。
ステート 3問
ステートとストラテジーの違いは?
形は同じです。ステートでは、オブジェクトが進むにつれて状態が入れ替わります。ストラテジーでは、呼び出し側がアルゴリズムを選びます。
次の状態は誰が決めますか?
ここでは各状態が次の状態を返します(New.pay() は Paid を返す)。もう一つの方法は、コンテキストが決めることです。どちらを選んだか明記してください。
状態に sealed インターフェースを使うのはなぜですか?
コンパイラはすべての状態を把握しているので、それに対する switch がチェックされ、ファイルの外で状態を追加されることもありません。
ストラテジー 3問
ラムダはストラテジーをどう変えますか?
ストラテジーは多くの場合、関数型インターフェースになるので、各アルゴリズムはクラスではなく一行のラムダで書けます。
ストラテジーとテンプレートメソッドの違いは?
ストラテジーは、合成によってアルゴリズム全体を実行時に差し替えます。テンプレートメソッドは手順を固定し、サブクラスが一部の手順を埋められるようにします。
実行時にストラテジーはどこから来ますか?
名前で引くマップ(このキットのように)、設定ファイル、または依存性注入です。
テンプレートメソッド 3問
テンプレートメソッドを final にするのはなぜですか?
サブクラスが手順の順序を変えられないようにするためです。サブクラスは、与えられた手順の中身を埋めることだけができます。
フックとは何ですか?
デフォルトを持つ省略可能な手順で、サブクラスが上書きできます(ここでは footer() は "" を返す)。
テンプレートメソッドはどの原則を示していますか?
ハリウッド原則です。「私たちに電話しないでください。こちらから電話します」。基底クラスがサブクラスの手順を呼び出します。
ビジター 3問
ダブルディスパッチとは何ですか?
実行されるメソッドは二つの実行時の型で決まります。item.accept(v) が要素の型を選び、次に v.visitBook(this) がビジターのメソッドを選びます。
Java 21 はビジターに何をもたらしますか?
sealed 型とパターンマッチングを使えば、要素の型に対する switch は網羅性がチェックされ、多くの場合ビジタークラスが不要になります。
ビジターが合わないのはどんなときですか?
操作を追加するより型を追加する頻度が高いときです。型を追加するたびに、すべてのビジターを変更しなければなりません。

ここでは無料、またはキット一式をまとめて入手

このページで無料

  • 全23パターン:課題、考え方、使わない方がよい場合、置き換えるコードスメル
  • 各パターンの Java ファイル全体と、実際の出力
  • 使い分け一覧表と、69 問の面接質問(回答付き)

よくある質問

Java は何のバージョンが必要ですか?

Java 21 以降です。すべてのファイルは -Xlint:all -Werror 付きでコンパイルされ、JDK 21 と JDK 25 で同じ出力になることを確認しています。古い Java の場合は run-all.sh が教えてくれます。

Maven は必要ですか?

いいえ。run-all.sh / run-all.cmd は javac でコンパイルして 23 のサンプルすべてを実行します。個々のファイルは java File.java で実行できます。Maven は JUnit テスト(mvn test)のためだけに必要です。

どの IDE を使えばいいですか?

どれでも使えます。フォルダーを IntelliJ IDEA、Eclipse、VS Code で Maven プロジェクトとして開いてください。すべてのサンプルに main メソッドがあります。

コードは仕事で使えますか?

はい、自分のプロジェクトにコピーして使ってください。キット自体の再販はしないでください。

開発者と学生向けのその他のツール

すべてのツールを見る

この結果をメールで受け取る
上に表示されている内容のコピーを受信トレイにお届けします。ツールは無料のままで、ここでロックされている機能はありません。

同じ作業に役立つツール

Javaデザインパターン:コード内の問題を選ぶと、動く短いJavaファイルでパターンが手に入りますShorts 向け AI 動画クリッパー、クレジット不要クレジット不要の Shorts 向け AI 動画クリッパー:9:16 のベストクリップをランク付けし、アップロードは一切ありません。無料版Javaデザインパターン:コード内の問題を選ぶと、動く短いJavaファイルでパターンが手に入りますLongday Code Themeすべての色は3つの背景面で確認済み無料版
同じ方がよく使うツール
開発者とコンプライアンス担当チーム向けのすべて → · ReadyStack Pass — すべてのツールが一つのサブスクリプションで · すべてのツール →

よくある質問

このページでは何ができますか?

GoF全23パターンをJava 21の短いコードと実行結果で解説し、場面別早見表と答え付きの面接質問69問も収録しています。

無料ですか?

はい。このページの無料版はアカウントなしで使えます。

使い方は?

1. 下の無料版に、ご自分の数字や内容を入力します。 2. 結果はこのページですぐに表示されます。 3. さらに必要なら、完全版で「得られるもの」の内容が追加されます。

このツールについて質問する

質問ひとつに、作った本人が答えます。メールは回答が欲しい場合のみ。

チーム・会社でのご利用:会社名入りの請求書、見積もり、複数ライセンスは support@getreadystack.com までご連絡ください。

「その他」のほかのツール すべて見る →

Creator Toolkit for WhopCreator Toolkit for Whopブラウザで動作し、Whopの権限は不要。サンプルデータ例:$49と$19のプランで14か月間・会員190人。$19〜Shopify アフィリエイトアプリ:報酬を支払う前に1件ずつチェックShopify アフィリエイトアプリ:報酬を支払う前に1件ずつチェックShopifyの注文CSVとアフィリエイター一覧をドロップ。サンプルの紅茶店(架空:注文37件・アフィリエイター4人・支払日2026-10…$9.99〜トレード記録+プロップファームの規定チェックトレード記録+プロップファームの規定チェックブローカーのCSV(Tradovate、NinjaTrader、TradingView、MetaTrader、TopstepX、Rithmi…$14.99〜ドイツ語→英語翻訳(Shopify):ドイツ語のストアをチェック済みの英語に。インポート用ファイル1つで戻せますドイツ語→英語翻訳(Shopify):ドイツ語のストアをチェック済みの英語に。インポート用ファイル1つで戻せますドイツ語のShopifyストアを英語に。翻訳CSVに用語集・ブランド名保護・Chrome内蔵翻訳で英語を入れ、11項目チェック後にインポート…$14.99〜多言語ヘルプデスク:ショップ問い合わせ受信箱。チャットとメールを一か所に、すべてのお客様にその言語で返信多言語ヘルプデスク:ショップ問い合わせ受信箱。チャットとメールを一か所に、すべてのお客様にその言語で返信オンラインショップ向けヘルプデスク。チャットとメールを一覧化し、英語・ドイツ語・スペイン語・ポルトガル語・日本語で双方向翻訳。AI下書きは注…この一皿の原価はいくら?売値はいくらにすべき?この一皿の原価はいくら?売値はいくらにすべき?レシピ原価を1セント単位で計算し、目標原価率から売価を算出。lb・oz・g・カップ等の単位を混在可。仕入れ値の変更は全メニューに自動反映。登…