💡gntk.dev

【Singleton】GoFのデザインパターンを学ぶ

GoFのデザインパターンをTypeScriptで写経しました。今回はSingletonパターンです。

post-cover

概要

システムの中に1つしか存在しないことが保証されたインスタンスを生成するためのパターン。

サンプルコード

結城浩先生の増補改訂版Java言語で学ぶデザインパターン入門のJavaプログラムをTypeScriptで写経した。

Singletonパターンで登場するクラスは、1つだけ。

singleton.ts

export class Singleton {
  private static singleton: Singleton = new Singleton();
  private constructor() {
    console.log('Generate a singleton instance');
  }
  public static getInstance(): Singleton {
    return this.singleton;
  }
}

コンストラクタがprivateになっていて、Singletonクラス外からコンストラクタを呼び出す事ができないようになっている。唯一のインスタンスは、Singletonクラス内で定義されているstaticなプロパティsingletonのみ。オブジェクトの要素は基本的にnewして作られるインスタンスごとにデータを保持するが、staticをつけたプロパティは、インスタンスではなくてクラスにデータを保持する。

Singletonの使い方は以下の通り。

singleton.test.ts

import { Singleton } from 'singleton/singleton';

describe('singleton', () => {
  const obj1: Singleton = Singleton.getInstance();
  const obj2: Singleton = Singleton.getInstance();

  test('singletonから同じインスタンスが作られる', () => {
    expect(obj1 === obj2).toBe(true);
  });
});

Singletonを利用するときは、getInstanceでstaticなプロパティsingletonを取得する。テストで表現している通り、getInstanceによって作られたインスタンスは、同一のものになる。

実際、インスタンスを生成した時に表示されるメッセージも、テスト実行時は1回しか表示されていない。

$ yarn test
yarn run v1.22.10
〜〜省略〜〜
 PASS  src/singleton/singleton.test.ts
  ● Console

    console.log
      Generate a singleton instance

      at new Singleton (src/singleton/singleton.ts:4:13)
〜〜省略〜〜
-------------------------|---------|----------|---------|---------|-------------------
File                     | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
-------------------------|---------|----------|---------|---------|-------------------
All files                |     100 |      100 |     100 |     100 |
〜〜省略〜〜
 singleton               |     100 |      100 |     100 |     100 |
  singleton.ts           |     100 |      100 |     100 |     100 |
〜〜省略〜〜
-------------------------|---------|----------|---------|---------|-------------------
〜〜省略〜〜

考察・感想

newしないならいつインスタンス生成されてるんだ、と思ったが、結城先生の本曰く、getInstanceを呼び出したタイミングらしい。

この例だと何も持ってないSingletonを作ったが、実際Singleton使うときはプロパティやメソッドは全部staticにするかんじなのだろうか。

© 2021 gntk.dev