ちゃんなるぶろぐ

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

【5分でわかる🚀】TypeScriptでDesign Pattern〜Singleton Pattern〜

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

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

概要

Singletonパターンは、特定のクラスのインスタンスを1つだけ生成し、それをグローバルにアクセスできるようにするデザインパターンです。

これにより、同じクラスから複数のインスタンスが生成されることを防ぐことができます👍

サンプルコード

Singletonクラスを作成

まずは、Singletonクラスを作成してみましょう。例として、Databaseクラスを作成し、コンストラクタをprivateにして外部からのインスタンス生成を制限します。

class Database {
  private static instance: Database | null = null;

  private constructor() {}

  public static getInstance(): Database {
    if (this.instance === null) {
      this.instance = new Database();
    }
    return this.instance;
  }

  public query(query: string): void {
    console.log(`Running query: ${query}`);
  }
}

インスタンスの利用

Singletonパターンを使って、Databaseクラスのインスタンスを取得し、クエリを実行してみましょう。

const db1 = Database.getInstance();
db1.query('SELECT * FROM users;');

const db2 = Database.getInstance();
db2.query('SELECT * FROM products;');

console.log(db1 === db2); // true

この例では、db1とdb2は同じインスタンスを参照していることが確認できます👍

Singleton Patternの使い道

以下のような状況で役立ちます。

  • リソースの共有:データベース接続や設定情報など、アプリケーション全体で共有する必要があるリソースを管理したい場合
  • グローバルな状態の保持:アプリケーション全体で共有される状態を一元管理したい場合

組み合わせられるデザインパターン

他のデザインパターンと組み合わせることで、さらに便利な設計ができます。

例えば、

  • Factory Method Pattern: SingletonパターンとFactoryパターンを組み合わせることで、アプリケーション全体で共有されるオブジェクトの生成を制御できる

chan-naru.hatenablog.com

  • Observer Pattern: Singletonオブジェクトが状態の変化を検知し、登録されたObserverに通知することで、アプリケーションの異なる部分が連携して動作するようになる

chan-naru.hatenablog.com

まとめ

Singletonパターンは、特定のリソースを共有する際や、グローバルな状態を保持する必要がある場合に役立ちます👀

ただし、適切に使われないと、テストや拡張性が損なわれる場合もあるので注意してください🖐️

参考文献

www.oreilly.com

en.wikipedia.org