どうも、ちゃんなるです!
今回は、Abstract Factory PatternをTypeScriptのサンプルコードを用いて紹介します🖐️
概要
Abstract Factory Patternは、関連するオブジェクトの集まりを作成するインターフェースを提供するデザインパターンです。
これにより、具体的なクラスを指定せずにオブジェクトを生成できるため、柔軟なコード設計が可能です。
「工場(Factory
)が製品(Product
)を作る」という概念をオブジェクト作成に落とし込んだものと言えます🏭
説明 | 役割 |
---|---|
AbstractProduct |
AbstractFactory によって作られる抽象 的な部品や製品のインタフェースを定義する |
AbstractFactory |
AbstractProduct のインスタンスを作るためのインタフェースを定義する |
Client |
AbstractFactory と AbstractProduct のインタフェースのみ を使って仕事を行う |
具体的な部品や製品や工場については知らない | |
--- 以降は具体 ↓↓↓ --- | |
ConcreteProduct |
AbstractProduct のインタフェースを実する |
ConcreteFactory |
AbstractFactory のインタフェースを実装する |
今回示すプログラムの設計について
今回のシナリオでは、異なるデバイス(スマートフォン、タブレット)向けのUIコンポーネントを生成する例を見ていきます📱
AbstractFactory
: UIコンポーネント生成用のインターフェースSmartphoneFactory
: スマートフォン向けUIコンポーネント生成用の具象ファクトリTabletFactory
: タブレット向けUIコンポーネント生成用の具象ファクトリButton
: ボタンコンポーネントの抽象クラスSmartphoneButton
: スマートフォン向けボタンコンポーネントTabletButton
: タブレット向けボタンコンポーネントSlider
: スライダーコンポーネントの抽象クラスSmartphoneSlider
: スマートフォン向けスライダーコンポーネントTabletSlider
: タブレット向けスライダーコンポーネント
サンプルコード
interface AbstractFactory { createButton(): Button; createSlider(): Slider; } class SmartphoneFactory implements AbstractFactory { createButton(): Button { return new SmartphoneButton(); } createSlider(): Slider { return new SmartphoneSlider(); } } class TabletFactory implements AbstractFactory { createButton(): Button { return new TabletButton(); } createSlider(): Slider { return new TabletSlider(); } } abstract class Button {} class SmartphoneButton extends Button {} class TabletButton extends Button {} abstract class Slider {} class SmartphoneSlider extends Slider {} class TabletSlider extends Slider {}
実際にAbstract Factory Patternを使って端末を生成してみましょう🖐️
const createUIComponents(factory: AbstractFactory) => { const button = factory.createButton(); const slider = factory.createSlider(); // AbstractFactoryを通じて生成されたUIコンポーネントを利用できる // 例えば、イベントリスナーの追加や、DOMにコンポーネントを追加するなどの処理を行うことができる } // 具体的なファクトリを選択してUIコンポーネントを生成することができる let factory: AbstractFactory = new SmartphoneFactory(); createUIComponents(factory); // 別のファクトリを選択するのも容易 factory = new TabletFactory(); createUIComponents(factory);
Abstract Factory Patternの使い道
Abstract Factory Patternは、オブジェクトの生成プロセスを抽象化することで、コードの柔軟性と保守性を向上させることができます。
例えば、UIコンポーネントの生成や、異なる環境(OS、デバイスなど)に対応するオブジェクトの生成に有用です。
組み合わせられるデザインパターン
以下のようなデザインパターンと組み合わせることができます。
Singleton Pattern
各具象ファクトリをシングルトンとして実装することで、アプリケーション内で一貫したオブジェクト生成が可能になります。
Factory Method Pattern
Abstract Factory
内でFactory Method
を使用することで、オブジェクト生成の詳細をサブクラスに委譲し、さらに柔軟な実装が可能になります。
Bridge Pattern
Abstract Factory
を使用して、異なる抽象化と実装の組み合わせを生成することができます。
まとめ
Abstract Factory Patternは、関連するオブジェクトの集まりを生成するためのインターフェースを提供するデザインパターンです。
このパターンを適用することで、コードの柔軟性と再利用性が向上します。 また、他のデザインパターンと組み合わせて使用することで、さらに強力な設計が可能になります。
ぜひ応用してみてください✌️