Singletonパターンの解説

Singletonパターンとは、クラスのインスタンスがただ一つだけ生成されるように制限するデザインパターンだ。これにより、システム全体で同じオブジェクトを共有することができる。

たとえば、ゲームの設定を管理する場合、複数の設定オブジェクトがあると混乱するので、設定は一つだけにしたい。Singletonパターンはこうした場合に役立つ。

では、サンプルコードを一緒に見ていこう。

解説

学校の校長先生を考えてみよう。学校には校長先生が一人しかいないから、校長先生のクラスも一人だけ作られるようにするんだ。もし誰かがもう一人校長先生を作ろうとしたら、すでにある校長先生を返すようにする。

Step 1: 校長先生クラスを作る

まず、校長先生を表すクラスを作るよ。校長先生には名前と学校の名前を持たせておこう。


// 校長先生クラス
class Principal {
  constructor(name, school) {
    this.name = name;
    this.school = school;
  }

  introduce() {
    console.log(`私は${this.school}の校長、${this.name}です。`);
  }
}
      

Step 2: Singletonの仕組みを追加する

次に、校長先生が一人しかいないように、Singletonの仕組みを追加しよう。校長先生がまだいなければ新しいインスタンスを作り、すでにいる場合は同じ校長先生を返すようにする。


// Singletonを管理する校長先生クラス
class PrincipalSingleton {
  constructor(name, school) {
    // インスタンスが既に作られているかチェック
    if (PrincipalSingleton.instance) {
      return PrincipalSingleton.instance;
    }

    // 初回の場合、新しい校長先生を作る
    this.principal = new Principal(name, school);
    PrincipalSingleton.instance = this;
  }

  getPrincipal() {
    return this.principal;
  }
}
      

Step 3: Singletonパターンを使って校長先生を作る

最後に、Singletonパターンを使って校長先生を作るよ。何度新しい校長先生を作ろうとしても、常に同じ校長先生が返ってくるんだ。


// 校長先生のインスタンスを作成
const firstPrincipal = new PrincipalSingleton("山田", "中央小学校").getPrincipal();
firstPrincipal.introduce(); // 結果: 私は中央小学校の校長、山田です。

// もう一人校長先生を作ろうとしても、同じ校長先生が返ってくる
const secondPrincipal = new PrincipalSingleton("佐藤", "北小学校").getPrincipal();
secondPrincipal.introduce(); // 結果: 私は中央小学校の校長、山田です。

console.log(firstPrincipal === secondPrincipal); // 結果: true
      

Singletonパターンの重要なポイント

これでSingletonパターンの解説は終わりだ。
このパターンを使うと、アプリケーション全体で一つだけのインスタンスを確実に保つことができるので、データの一貫性を守りたいときに便利だ。