Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

プログラミングには、アプリケーションでインスタンスを一つだけ生成することを保証する「シングルトン(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のプロジェクトでシングルトンが必要になった場合にご利用ください。

tonkotsuboy_com
ICSのインタラクションデザイナーです。「JavaScriptコードレシピ集」の著者。CSS Nite 2017・2018でベストセッションの1人に選出されました。 アプリ開発やWebページ制作が専門で、フロントエンドの情報を随時発信しています。猫の名前は「うに」です。九州大学芸術工学部音響設計学科出身。
https://ics.media
ics
インタラクションデザイン専門のプロダクション。最先端のウェブテクノロジーを駆使し、オンスクリーンメディアの表現分野で活動しています。最新のウェブ技術を発信するサイト「ICS MEDIA」を運営。
https://ics.media/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした