シングルトン
公開日: 2025/06/02
シングルトンパターンとは?──たった一つのインスタンスを保証する設計原則
はじめに
ログ記録や設定管理など、アプリケーション全体で1つだけのインスタンスを共有したい場面は少なくありません。
そうした「唯一無二のインスタンス」を保証し、どこからでも安全にアクセスできるようにする設計パターンが「シングルトン(Singleton)パターン」です。
本記事では、シングルトンの仕組み、用途、実装例、利点とリスクを解説します。
基本情報・概要
シングルトンパターンとは、あるクラスのインスタンスを1つだけ生成し、それをアプリケーション全体で共有する設計パターンです。
主な目的:
- グローバルな状態を安全に管理
- 複数生成を防ぎ、リソースを節約
- 共有インスタンスに一貫したアクセスを提供
多くの場合、「newではなく getInstance() 経由でインスタンス取得」を採用します。
比較・分類・特徴の表形式まとめ(任意)
特徴 | 説明 |
---|---|
インスタンスは1つ | 外部からは同じインスタンスしか取得できない |
グローバルアクセス | どこからでもインスタンスにアクセス可能 |
状態の共有 | データや設定などをアプリケーション全体で統一管理 |
遅延初期化 | 実際に必要になるまでインスタンスを作らないことが可能 |
シングルトンは「設計でグローバル変数を管理する方法」とも言えます。
深掘り解説
✅ JavaScriptによる基本的な実装例
class ConfigManager { constructor() { if (ConfigManager._instance) { return ConfigManager._instance; } this.config = {}; ConfigManager._instance = this; } set(key, value) { this.config[key] = value; } get(key) { return this.config[key]; } } const a = new ConfigManager(); const b = new ConfigManager(); console.log(a === b); // true
- 2回
しても同じインスタンスが返るのが特徴new
プロパティを使ってインスタンスの重複を防止static
他の言語でも同様に、private constructor(プライベートコンストラクタ)とstatic method(
getInstance
)で実現されます。
応用・発展的な使い方
- ログ管理(Logger):アプリ全体で同じログファイルを使用
- 設定の一元管理(Config):読み込んだ設定情報を全体で共有
- DB接続管理(ConnectionPool):コネクションの再利用と統制
- キャッシュ(In-memory cache):グローバルなメモリ領域として利用
シングルトンは「一貫性」と「リソース節約」の観点で有効に使えます。
よくある誤解と注意点(任意)
- グローバル変数の代用と誤解される:管理された唯一性とライフサイクル制御が本質
- テストが難しくなる:状態が共有されていると、モック化や依存の切り替えが困難に
- マルチスレッド・非同期環境では競合の危険:言語によっては排他制御が必要
- 使いすぎるとアンチパターン化:責務の集中や密結合を招くこともある
シングルトンは「便利だけど慎重に使うべき設計パターン」の代表格です。
まとめ
シングルトンパターンは、アプリケーション全体で共有すべき唯一のインスタンスを安全に管理するための基本設計パターンです。
適切に使えば、構造がシンプルになり、パフォーマンスも向上しますが、安易な濫用は保守性の低下やテスト困難を招く可能性があります。
「本当に1つで良いのか?」という問いを忘れずに、必要最小限でシングルトンを使いこなしていきましょう。