概要
システムの中に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にするかんじなのだろうか。