【しんぐるとん】

シングルトン とは?

💡 「絶対に1個しかない」インスタンスを保証する番人
📌 このページのポイント
シングルトンパターン 呼び出し元 A クラスA 呼び出し元 B クラスB 呼び出し元 C クラスC getInstance() Singleton - constructor() - static instance + getInstance() 🔒 参照 唯一の インスタンス どこから呼んでも同じインスタンスを返す。グローバル状態の管理に使用。 例: ログマネージャー、設定管理、DB接続プール
シングルトンパターン
ひよこ ひよこ

シングルトンって何のためにあるの?

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

アプリ全体で「同じ1つ」のものを使いたいときのためだよ。設定ファイルの内容を管理するクラスが2つあったら、片方の変更がもう片方に反映されない問題が起きる。シングルトンにすれば全員が同じオブジェクトを使うからズレが起きない。

ひよこ ひよこ

どうやって1個しか作れないようにするの?

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

コンストラクタをprivateにして外から「new」させない。代わりに「getInstance()」というstaticメソッドを公開して、初回は作って返す、2回目以降は作ったものを返す、という実装にする。

ひよこ ひよこ

なんでアンチパターンって言われるの?

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

グローバル変数と同じ問題が起きやすいから。どこからでもアクセスでき、誰でも状態を変えられる。テストのとき別の実装に差し替えにくい。「シングルトンに依存している関数」を単体でテストしたくても、本物のシングルトンがくっついてくる。

ひよこ ひよこ

じゃあどうすればいいの?

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

依存性の注入(Dependency Injection)を使うのが現代的なアプローチ。シングルトンを直接使うのではなく、外からオブジェクトを渡してもらう設計にする。テスト時はモックオブジェクトを渡せるから柔軟にテストできる。シングルトンが「アンチパターン」と呼ばれるのは存在自体が悪いのではなく「テスタビリティを考慮しない使い方」が問題で、Node.jsのモジュールキャッシュを使ったモジュールレベルシングルトンのような実装では、この問題を和らげる工夫がされている。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
シングルトンって出てきたら「アプリ全体で1個だけのインスタンス」と思えばだいたいOK!
📖 おまけ:英語の意味
「Singleton」 = 単独のもの・1つだけの存在
💬 「Single(1つの)」+「-ton(存在)」。トランプのソリティア(Solitaire)と同語根。唯一の存在というニュアンス
← 用語集にもどる