シングルトンパターン
クラスのインスタンスが 1 つだけ存在することを保証するデザインパターン
設計パターン設計
シングルトンパターンとは
シングルトンパターンは、クラスのインスタンスが 1 つだけ存在することを保証し、グローバルなアクセスポイントを提供するデザインパターンである。GoF デザインパターンの生成パターンに分類される。
TypeScript での実装
TypeScript での実装のコード例を示す。
class DatabaseClient {
private static instance: DatabaseClient;
private constructor() { /* 初期化 */ }
static getInstance(): DatabaseClient {
if (!DatabaseClient.instance) {
DatabaseClient.instance = new DatabaseClient();
}
return DatabaseClient.instance;
}
}
const db1 = DatabaseClient.getInstance();
const db2 = DatabaseClient.getInstance();
db1 === db2; // true (同じインスタンス)
モジュールスコープのシングルトン (推奨)
モジュールスコープのシングルトン (推奨) のコード例を示す。
// TypeScript ではモジュールがシングルトンとして機能
// db.ts
export const db = new DynamoDBClient({});
// どこから import しても同じインスタンス
// handler.ts
import { db } from './db';
ES Modules は 1 回だけ評価されるため、export const がシングルトンになる。クラスベースのシングルトンは不要。
シングルトンの問題点
シングルトンの問題点を以下にまとめる。
| 問題 | 説明 |
|---|---|
| テスト困難 | グローバル状態でテストが干渉 |
| 隠れた依存 | どこからでもアクセスできる |
| 並行処理 | マルチスレッドで競合の可能性 |
| 密結合 | 具体的な実装に依存 |
いつシングルトンを使うか
いつシングルトンを使うかの判断基準を以下にまとめる。
| ケース | 推奨 |
|---|---|
| DB クライアントの再利用 | ✅ モジュールスコープ |
| 設定の一元管理 | ✅ モジュールスコープ |
| ビジネスロジック | ❌ 依存性注入 |
| テストが必要なコード | ❌ 依存性注入 |
基礎から学ぶなら関連書籍が手がかりになる。
この記事は役に立ちましたか?
関連用語
デザインパターン
ソフトウェア設計で繰り返し現れる問題に対する再利用可能な解決策のカタログ
ファクトリパターン
オブジェクトの生成ロジックをカプセル化し、生成方法の詳細を隠蔽するデザインパターン
依存関係
モジュールやサービスが他のモジュールやサービスに依存する関係で、結合度と変更の影響範囲を決定する
スコープ
変数や関数が参照可能な範囲を定義するプログラミングの基本概念
State パターン
オブジェクトの内部状態に応じて振る舞いを切り替え、状態遷移を明示的にモデル化するデザインパターン
リポジトリパターン (GoF)
データアクセスロジックをカプセル化し、ビジネスロジックからデータストアの詳細を隠蔽するパターン