プログラミングには、**アプリケーションでインスタンスを一つだけ生成することを保証する「シングルトン(Singleton)パターン」**という手法(デザインパターン)があります。例えばゲームのアプリを作るとき、ゲームのデータを管理するクラスのインスタンスは1度生成して使い回したい場合もあるでしょう。
TypeScript 1系では記事「TypeScriptでシングルトン(Singleton)パターンを使おう」で示すような冗長な書き方が必要でしたが、TypeScriptの2系では短かく書けるようになりました。
TypeScript 2+でシングルトンパターンを使う方法
TypeScript 2+ではコンストラクターにアクセス修飾子private
(クラス内でのみアクセス可能)を設定できます。Hoge
クラスをシングルトンパターンで実装します。
/**
* シングルトンパターンで実装された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
を実行します。
const hoge:Hoge = Hoge.instance;
Hoge.instance
を複数回実行しても、Hoge
のインスタンスは一度しか生成されません。次のサンプルコードで挙動を確認します。
// 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のプロジェクトでシングルトンが必要になった場合にご利用ください。