Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
25
Help us understand the problem. What is going on with this article?
@tonkotsuboy_com

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

More than 3 years have 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のプロジェクトでシングルトンが必要になった場合にご利用ください。

25
Help us understand the problem. What is going on with this article?
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
tonkotsuboy_com
フロントエンド / 九州大学卒 / ウェブ制作 / JavaScriptコードレシピ集の著者 / CSS Nite 2017〜2019ベストセッション / TechFeed公認エキスパート /お仕事依頼はDMまで
moneyforward
「お金を前へ。人生をもっと前へ。」をMissionとして、個人向け、法人向け様々なFintechサービスを開発、提供しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
25
Help us understand the problem. What is going on with this article?