ブログ一覧
デザインパターンGoF設計

デザインパターンは暗記するものじゃない — 状況から導き出す3つのパターン

GoFの23パターン、暗記していますか?

暗記している必要はありません。必要になった時に引き出せることが重要です。

パターンは「結論」ではなく「過程」

デザインパターンは、同じ問題に何度も遭遇した先人たちの結論です。

暗記するのではなく、「なぜこの解決策にたどり着いたのか」を理解することで、自分の状況で引き出せるようになります。

よく出会う3つのパターン

1. Strategy パターン

状況: 同じ処理を複数の方法で切り替えたい。

interface SortStrategy {
  sort(data: number[]): number[];
}
class QuickSort implements SortStrategy { /* ... */ }
class MergeSort implements SortStrategy { /* ... */ }

class Sorter {
  constructor(private strategy: SortStrategy) {}
  execute(data: number[]) {
    return this.strategy.sort(data);
  }
}

if-elseの代わりに、戦略をオブジェクトとして注入する。OCP(開放閉鎖原則)を実現。

2. Observer パターン

状況: 状態変化を複数の箇所に通知したい。

ReactのuseStateやRxJS、イベントリスナーなど、日常的に使っています。気づいていないだけです。

class EventBus {
  private listeners: Record<string, Function[]> = {};
  on(event: string, fn: Function) {
    (this.listeners[event] ||= []).push(fn);
  }
  emit(event: string, data: unknown) {
    this.listeners[event]?.forEach(fn => fn(data));
  }
}

3. Factory パターン

状況: インスタンス生成ロジックを呼び出し側から隠したい。

class DatabaseFactory {
  static create(type: "mysql" | "postgres"): Database {
    if (type === "mysql") return new MySQL();
    if (type === "postgres") return new Postgres();
    throw new Error("unknown db");
  }
}

newを直接呼ぶと、呼び出し側が具象クラスに依存します。Factoryを通すと抽象化できます。

CodeSenseiでパターンを体感する

『デザインパターン』『実践デザインパターン』『Head First デザインパターン』 — CodeSenseiはこれらの書籍の視点であなたのコードを見ます。

「このif-elseはStrategyパターンで置き換えられる」「このイベントハンドラはObserverパターンの実装例だ」とAIが教えてくれます。

パターンを暗記するのではなく、自分のコードから発見する学び方です。


CodeSenseiを試す →

自分のコードで学んでみませんか?

CodeSenseiは無料で始められます。

無料で始める