デザインパターン

デザインパターンとは

デザインパターンは、ソフトウェア設計で繰り返し現れる課題に対する定石としてまとめられた解決パターンです。GoF(Gang of Four)と呼ばれる4人の著者が1994年にまとめた23パターンが有名で、オブジェクト指向設計の共通知識になっています。

パターンには名前が付いているため、チームの共通言語(語彙)として機能します。「ここは Observer で」と一言で設計意図が伝わるのは大きな価値です。

代表的なパターン

パターン解決する課題
Singleton(シングルトン)インスタンスを全体で1つに制限したい
Factory(ファクトリ)生成するオブジェクトの種類を呼び出し側から隠したい
Observer(オブザーバ)状態の変化を複数の関係者に自動通知したい
Strategy(ストラテジ)アルゴリズムを実行時に切り替えたい
Adapter(アダプタ)互換性のないインターフェース同士をつなぎたい
// Strategy パターンの例: 並び替え方法を外から差し替える
const byPrice = (a, b) => a.price - b.price;
const byName = (a, b) => a.name.localeCompare(b.name);

function sortItems(items, strategy) {
  return [...items].sort(strategy);
}
sortItems(products, byPrice); // 戦略を切り替えられる

身近な例では、ブラウザの addEventListener は Observer パターンそのものですし、[[MVCアーキテクチャ]] は複数のパターンを組み合わせた構造と言えます。

パターンの使いどころと注意点

  • パターンは課題があって初めて使うものです。課題がないのにパターンを当てはめると、かえって複雑になります(パターンの乱用)
  • 特に Singleton は「グローバル変数の言い換え」になりやすく、テストしにくいコードの原因として現代では慎重に扱われます
  • [[フレームワーク]] の内部には多くのパターンが使われています。パターンを知っているとフレームワークの設計意図が読めるようになります

初学者向けポイント

  • 23パターンの暗記は不要です。まず Observer・Strategy・Factory あたりを実際のコードで見て理解するのが近道です
  • 「このコード、どこかで見た構造だな」と感じたら、それがパターン学習の入り口です
  • [[リファクタリング]] の目標地点としてパターンが使われることもあります(パターンに向けて整理する)
  • パターン名で会話できると、[[クリーンコード]] の議論やコードレビューがスムーズになります

関連技術とのつながり

  • [[クリーンコード]] — パターンは読みやすく変更しやすい設計の道具
  • [[リファクタリング]] — パターンを目標にコードを整理することがある
  • [[フレームワーク]] — 内部に多くのパターンが組み込まれている
  • [[MVCアーキテクチャ]] — パターンを組み合わせた代表的な構造
Q: デザインパターンとは何?
- [x] 設計で繰り返し現れる課題への定石的な解決パターン集
- [ ] 画面のビジュアルデザインのテンプレート集
- [ ] プログラミング言語の文法ルール
解説: デザインパターンはソフトウェア設計の定石集で、GoF の23パターンが有名です。

Q: 状態の変化を複数の関係者に自動通知したいときに使うパターンはどれ?
- [ ] Singleton
- [x] Observer
- [ ] Adapter
解説: Observer パターンは変化の通知を扱います。ブラウザの addEventListener が身近な例です。

Q: パターンの使い方として本文が注意を促しているのはどれ?
- [ ] パターンは23個すべて暗記してから使う
- [ ] できるだけ多くのパターンを1つのコードに詰め込む
- [x] 課題がないのにパターンを当てはめると複雑になる
解説: パターンは課題があって初めて使う道具です。乱用はかえってコードを複雑にします。