52
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TypeScript 2ではシングルトン(Singleton)パターンが短く書ける

Last updated at Posted at 2017-02-17

プログラミングには、**アプリケーションでインスタンスを一つだけ生成することを保証する「シングルトン(Singleton)パターン」**という手法(デザインパターン)があります。例えばゲームのアプリを作るとき、ゲームのデータを管理するクラスのインスタンスは1度生成して使い回したい場合もあるでしょう。

TypeScript 1系では記事「TypeScriptでシングルトン(Singleton)パターンを使おう」で示すような冗長な書き方が必要でしたが、TypeScriptの2系では短かく書けるようになりました。

TypeScript 2+でシングルトンパターンを使う方法

TypeScript 2+ではコンストラクターにアクセス修飾子private(クラス内でのみアクセス可能)を設定できますHogeクラスをシングルトンパターンで実装します。

TypeScript
/**
 * シングルトンパターンで実装されたHogeクラス
 */
class Hoge {
  /** インスタンス */
  private static _instance:Hoge;

  /** プライベートコンストラクタ */
  private constructor() {
  }

  /** インスタンスの取得 */
  public static get instance():Hoge {
    // _inctanceが存在しない場合に、new Hoge()を実行する。
    if (!this._instance) {
      console.log("☆ インスタンスを作成します。 ☆");
      this._instance = new Hoge();
    }

    // 生成済みのインスタンスを返す
    return this._instance;
  }
}

インスタンスの取得

Hogeクラスのインスタンスを取得するにはHoge.instanceを実行します。

Hogeのインスタンスの取得
const hoge:Hoge = Hoge.instance;

Hoge.instanceを複数回実行しても、Hogeのインスタンスは一度しか生成されません。次のサンプルコードで挙動を確認します。

TypeScript
// Hogeクラスのインスタンスが新規生成される。「☆ インスタンスを作成します。 ☆」のログが出力される。
const hoge1:Hoge = Hoge.instance;

// インスタンスが新規作成されないため、ログは出力されない。
const hoge2:Hoge = Hoge.instance;

// ■ コンストラクタがprivateな為、new Hoge()ではコンパイルエラー
// const hoge:Hoge = new Hoge();

コンソールログを見るとわかるように、Hogeクラスのインスタンスは一度きりしか生成されないのがわかります。インスタンスの取得はHoge.instanceでのみ行われるため、■部分のクラス外のnew Hoge()はコンパイルエラーとなります。

最後に

TypeScript 2で実装されたprivateなコンストラクタによって、シングルトンパターンがすっきり実装できるようになりました。TypeScriptのプロジェクトでシングルトンが必要になった場合にご利用ください。

52
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?