ちゃんなるぶろぐ

エンジニア5年生🧑‍💻 オライリーとにらめっこする毎日。

【5分でわかる🏭💨】TypeScriptでDesign Pattern〜Abstract Factory Pattern〜

どうも、ちゃんなるです!

今回は、Abstract Factory PatternをTypeScriptのサンプルコードを用いて紹介します🖐️

概要

Abstract Factory Patternは、関連するオブジェクトの集まりを作成するインターフェースを提供するデザインパターンです。

これにより、具体的なクラスを指定せずにオブジェクトを生成できるため、柔軟なコード設計が可能です。

「工場(Factory)が製品(Product)を作る」という概念をオブジェクト作成に落とし込んだものと言えます🏭

説明 役割
AbstractProduct AbstractFactory によって作られる抽象的な部品や製品のインタフェースを定義する
AbstractFactory AbstractProductインスタンスを作るためのインタフェースを定義する
Client AbstractFactoryAbstractProduct のインタフェースのみを使って仕事を行う
具体的な部品や製品や工場については知らない
--- 以降は具体 ↓↓↓ ---
ConcreteProduct AbstractProduct のインタフェースを実する
ConcreteFactory AbstractFactory のインタフェースを実装する

今回示すプログラムの設計について

今回のシナリオでは、異なるデバイススマートフォンタブレット)向けのUIコンポーネントを生成する例を見ていきます📱

サンプルコード

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

各具象ファクトリをシングルトンとして実装することで、アプリケーション内で一貫したオブジェクト生成が可能になります。

chan-naru.hatenablog.com

Factory Method Pattern

Abstract Factory内でFactory Methodを使用することで、オブジェクト生成の詳細をサブクラスに委譲し、さらに柔軟な実装が可能になります。

chan-naru.hatenablog.com

Bridge Pattern

Abstract Factoryを使用して、異なる抽象化と実装の組み合わせを生成することができます。

chan-naru.hatenablog.com

まとめ

Abstract Factory Patternは、関連するオブジェクトの集まりを生成するためのインターフェースを提供するデザインパターンです。

このパターンを適用することで、コードの柔軟性と再利用性が向上します。 また、他のデザインパターンと組み合わせて使用することで、さらに強力な設計が可能になります。

ぜひ応用してみてください✌️

参考文献

www.oreilly.com

en.wikipedia.org