デザインパターン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が教えてくれます。
パターンを暗記するのではなく、自分のコードから発見する学び方です。