デザインパターン
繰り返し現れる設計問題への、名前の付いた解法。 GoF(Gang of Four)の 23 パターンが古典。
分類#
| 分類 | 目的 | 例 |
|---|---|---|
| 生成 | オブジェクトの作り方 | Factory、Builder、Singleton |
| 構造 | 組み合わせ方 | Adapter、Decorator、Facade、Proxy |
| 振る舞い | やり取りの仕方 | Observer、Strategy、Command、State |
よく使うもの#
| パターン | 用途 |
|---|---|
| Strategy | アルゴリズムを差し替える |
| Observer | 変更を通知する |
| Adapter | 合わないインタフェースを繋ぐ |
| Factory | 生成の詳細を隠す |
| Decorator | 機能を積み重ねる |
| Facade | 複雑な内部を単純な窓口で隠す |
最大の価値は語彙#
「Observer で」と言えば伝わることが、 パターンの実務的な価値の大部分。 設計の議論が速くなる。
言語機能に吸収されたもの#
GoF は 1994 年の本で、当時の C++ / Smalltalk が前提。 現代の言語では言語機能で済むものがある。
| パターン | 現代の対応 |
|---|---|
| Strategy | 関数を渡す |
| Command | クロージャ |
| Iterator | for-in、Sequence |
| Observer | Combine、@Observable、シグナル |
| Singleton | アンチパターン扱いされることが多い |
Singleton の問題#
グローバルな可変状態
→ どこから変更されるか分からない
→ テストで初期化・差し替えができない
→ 依存が隠れる依存性注入で 必要な相手に渡す方が良い。
使い方#
パターンを当てはめるために設計しない。 問題に直面してから、対応するパターンがあるか探す。
「Factory を使いたい」から始まる設計は、 たいてい必要のない抽象を生む。
参考文献#
- Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1994.
- Christopher Alexander et al. A Pattern Language. Oxford University Press, 1977.(GoF の着想源)
- Martin Fowler. Patterns of Enterprise Application Architecture. Addison-Wesley, 2002.