Factory Methodパターン - TypeScriptでの柔軟なオブジェクト生成
柔軟なオブジェクト生成のためのFactory Methodパターンをマスターしましょう。TypeScriptのファクトリメソッドを使用してクライアントコードを具象クラスから分離する方法を学びます。
詳細な説明
Factory Methodパターン
Factory Methodパターンは、オブジェクトを作成するためのインターフェースを定義しますが、どのクラスをインスタンス化するかはサブクラスに決定させます。クライアントコードが具象クラス名を知る必要をなくし、疎結合を促進します。
解決する問題
コードがnew ConcreteClass()で直接オブジェクトをインスタンス化すると、密結合が生まれます。新しい型を追加するには、インスタンスが作成されるあらゆる場所で既存のコードを修正する必要があり、開放閉鎖の原則に違反します。
実装
interface Transport {
deliver(cargo: string): string;
}
class Truck implements Transport {
deliver(cargo: string) {
return \`陸路で\${cargo}を配送\`;
}
}
class Ship implements Transport {
deliver(cargo: string) {
return \`海路で\${cargo}を配送\`;
}
}
abstract class Logistics {
abstract createTransport(): Transport;
planDelivery(cargo: string): string {
const transport = this.createTransport();
return transport.deliver(cargo);
}
}
class RoadLogistics extends Logistics {
createTransport() { return new Truck(); }
}
class SeaLogistics extends Logistics {
createTransport() { return new Ship(); }
}
他のパターンとの関係
Factory MethodはAbstract Factory(関連オブジェクトのファミリーを作成するためにファクトリメソッドを使用)やTemplate Method(ファクトリメソッドは本質的にオブジェクト作成のテンプレートメソッド)と密接に関連しています。ファクトリがゼロから作成する代わりにオブジェクトをクローンする場合、Prototypeと組み合わされることもあります。
ベストプラクティス
将来新しいプロダクト型が追加されることが予想される場合にFactory Methodを使用しましょう。プロダクト型が1つか2つしかなく拡張の予定がない場合は、シンプルな条件分岐やパラメータ化されたファクトリ関数で十分かもしれません。
ユースケース
Factory Methodは、異なるプラットフォーム(Web、モバイル、デスクトップ)で異なるウィジェット実装が必要なUIフレームワーク、動的にモジュールを読み込むプラグインアーキテクチャ、設定に応じてメール、SMS、プッシュで送信する通知システムで広く使用されています。