【しんぐるとんぱたーん】

シングルトンパターン とは?

💡 「世界に1つだけ」のインスタンスを保証する
📌 このページのポイント
シングルトンパターン(Singleton Pattern) 通常のクラス Class new → instance1 new → instance2 new → instance3 毎回新しいインスタンス生成 シングルトン Singleton 唯一のinstance 呼出1 → 呼出2 → 呼出3 → すべて同じインスタンスを返す 例: DB接続、設定管理 クラスのインスタンスをただ1つだけに制限するパターン
シングルトンパターンのイメージ
ひよこ ひよこ

なんで1つだけにするの?

ペンギン先生 ペンギン先生

DB接続プールが複数あると接続が無駄に消費される、ロガーが複数あるとログが分散する、設定オブジェクトが複数あると不整合が起きる。「1つだけ存在すべきもの」を確実に1つに保証するのがシングルトンの役割だよ

ひよこ ひよこ

どうやって実装するの?

ペンギン先生 ペンギン先生

コンストラクタをprivateにする(外部からnewできない)、②staticメソッドgetInstance()でインスタンスを返す、③初回呼び出し時にインスタンスを生成し、2回目以降は同じものを返す。TypeScriptなら「export const logger = new Logger()」のようにモジュールスコープで1回だけ生成する方がシンプルだよ

ひよこ ひよこ

シングルトンのデメリットは?

ペンギン先生 ペンギン先生

①グローバル状態になるのでテストが困難(テスト間でシングルトンの状態が共有される)、②依存関係が隠れる(コードを読んでも依存が分かりにくい)、③マルチスレッド環境でのスレッドセーフ実装が必要。「アンチパターン」と見なされることも多いんだ

ひよこ ひよこ

代わりに何を使うべき?

ペンギン先生 ペンギン先生

DIコンテナのシングルトンスコープを使うのが現代的だよ。SpringやNestJSではサービスクラスをデフォルトでシングルトンスコープで管理してくれる。テスト時はモックに差し替えられるし、依存関係も明示的になる。自分でシングルトンを実装する場面はほとんどないね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
シングルトン」って出てきたら「インスタンスを1つだけに制限するパターン」と思えればだいたいOK!
📖 おまけ:英語の意味
「Singleton Pattern」 = シングルトンパターン
💬 Singleton(一人っ子、唯一のもの)。インスタンスが「一人っ子」になるパターンだよ
← 用語集にもどる