FactoryとFactory Method
Factoryは、値やオブジェクトの生成を一か所へ集約する広い呼び名です。Factory Methodは本来、基底クラスが生成の入口を定義し、サブクラスが生成する具体型を選べるようにするGoFパターンです。単純な生成関数をFactory Methodとは呼びません。
Factoryを採用する場面
- 生成時に検証、正規化、既定値の適用が必要になる
- 入力に応じて返す具体型が変わる
- constructorを直接公開すると不正な状態を作れてしまう
- 生成に必要な外部依存や非同期処理を呼び出し側から隠したい
TypeScriptでは、まず小さなfactory functionまたはstatic factoryを検討します。状態を持たない生成処理を、慣習だけでXxxFactoryクラスにしません。
Factory Methodを採用する場面
継承階層がすでに設計上必要で、サブクラスごとに一部の生成だけを差し替える場合に限ります。生成対象を選ぶswitchが一つあるだけなら、網羅的な分岐の方が追いやすいことがあります。
実装方針
- 生成後に保証される不変条件を明確にする
- 入力が不正な場合の戻り値や例外を、呼び出し側が扱える形にする
- 登録マップや動的プラグイン機構は、実際に拡張点が必要になってから導入する
- FactoryがI/O、キャッシュ、認可まで抱える場合は責務を分ける