Factory Methodパターン - TypeScriptでの柔軟なオブジェクト生成

柔軟なオブジェクト生成のためのFactory Methodパターンをマスターしましょう。TypeScriptのファクトリメソッドを使用してクライアントコードを具象クラスから分離する方法を学びます。

Creational

詳細な説明

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、プッシュで送信する通知システムで広く使用されています。

試してみる — Design Pattern Reference

フルツールを開く