🕌

デザインパターン ~Singletonパターン~

2022/01/09に公開

Singletonとは?

GoF(Gang of Four)デザインパターンの一つであり、あるクラスのインスタンスが一つしかない状態を保証する方法です。
普段開発をしていると、至るところでインタンスを作成することが多いと思います。
しかし、「このクラスのインスタンスはたった1つしか作らないし、作りたくない」というときもあります。
例で言うと、DBへの接続情報や、HTTPリクエストのセッション情報から取ってきたアクセスしているユーザーをあらわすオブジェクトなどです。
そういった、システム上1つしか存在しないものをプログラムで表現したいときに使えるのが、Singletonパターンです。

コードを書いてみよう

今回はTypeScriptで書いてみます。

class Singleton {
  private static instance: Singleton;

  private constructor() {};

  public static getInstance(): Singleton {
    if (!Singleton.instance) {
      Singleton.instance = new Singleton;
    }

    return Singleton.instance;
  }

  public someBusinessLogic() {
    // ...do something
  }
}

function clientCode() {
  const s1 = Singleton.getInstance();
  const s2 = Singleton.getInstance();

  if (s1 === s2) {
    console.log("Singleton works, both variables contain the same instance.");
  } else {
    console.log("Singleton failed, variables contains different instance.");
  }

}

clientCode();
clientCode();
clientCode();

clientCode(); を複数回呼び出しいますが、出力結果は以下のようになっており、インスタンスが1つしか生成されていないことが分かります。

"Singleton works, both variables contain the same instance."
"Singleton works, both variables contain the same instance."
"Singleton works, both variables contain the same instance."

Singletonが適しているケース

以下のケースではSingletonが適しているとされています。正直私もSingletonの賢い使いどころについては、キャッチアップ中なので、良い例が考えついたら、また記事を書こうと思います。

  • ロギング
  • キャッシュ管理
  • スレッドプール管理
  • データベース接続ドライバ
  • ソケット制御ドライバ

Singletonが適していないケース

参考サイト

https://refactoring.guru/design-patterns/singleton

Discussion