Abstract Factoryパターン - 関連オブジェクトのファミリー作成

関連オブジェクトのファミリーを作成するためのAbstract Factoryパターンを学びましょう。テーマシステム、クロスプラットフォームUI、データベースプロバイダーのTypeScript実装例。

Creational

詳細な説明

Abstract Factoryパターン

Abstract Factoryパターンは、具象クラスを指定することなく、関連するオブジェクトのファミリーを作成するためのインターフェースを提供します。一つのファミリーの製品が一貫して一緒に使用されることを保証します。

問題のシナリオ

ダークテーマとライトテーマをサポートするUIツールキットを想像してください。各テーマには、対応するボタン、入力フィールド、ダイアログのセットが必要です。ダークボタンとライトダイアログを混ぜると視覚的な不整合が生じます。Abstract Factoryは、完全なファミリーの作成をカプセル化することでこれを防ぎます。

構造

interface UIFactory {
  createButton(): Button;
  createDialog(): Dialog;
  createInput(): Input;
}

class MaterialFactory implements UIFactory {
  createButton() { return new MaterialButton(); }
  createDialog() { return new MaterialDialog(); }
  createInput() { return new MaterialInput(); }
}

class FluentFactory implements UIFactory {
  createButton() { return new FluentButton(); }
  createDialog() { return new FluentDialog(); }
  createInput() { return new FluentInput(); }
}

主な利点

クライアントコードは抽象インターフェースを通じてファクトリと製品を操作します。MaterialからFluentデザインに切り替えるには、ファクトリのインスタンス化の1行を変更するだけです。下流のすべてのコンポーネントが自動的に正しいファミリーを使用します。

トレードオフ

新しいプロダクト型(例:createCheckbox())を追加するには、ファクトリインターフェースとすべての具象ファクトリを変更する必要があります。プロダクトセットが頻繁に変更される場合、Abstract Factoryは硬直的になります。そのような場合は、Builderパターンや設定ベースのアプローチを検討してください。

現代での使用

TypeScriptやReactアプリケーションでは、Abstract Factoryはテーマプロバイダー、データベースドライバーファクトリ(PostgreSQLとMySQLの切り替え)、クロスプラットフォームレンダリングエンジンとして現れます。

ユースケース

Abstract Factoryは、複数のルック&フィール標準(Material、Fluent、Cupertino)、クロスプラットフォームデプロイメントターゲット(iOS、Android、Web)、または交換可能なインフラプロバイダー(AWS、GCP、Azure)をサポートする必要があり、すべてのコンポーネントが同じプロバイダーから提供されるアプリケーションに最適です。

試してみる — Design Pattern Reference

フルツールを開く