🧩 Singleton パターン
✅ 設計意図
- インスタンスが1 つしか存在しないように制限し、再利用する
✅ 適用理由
- 同じインスタンスをアプリケーション全体で使い回したい
- ロガー、設定、キャッシュなどの「共有状態を持つ」処理に適している
✅ 向いているシーン
- グローバルユーティリティ(Logger, ConfigManager など)
✅ コード例
- TypeScript
- PHP
- Python
class Logger {
private static instance: Logger;
private constructor() {}
static getInstance(): Logger {
if (!Logger.instance) {
Logger.instance = new Logger();
}
return Logger.instance;
}
log(message: string) {
console.log(`[LOG]: ${message}`);
}
}
class UserService {
private logger: Logger;
constructor() {
this.logger = Logger.getInstance(); // Singleton の取得
}
createUser(name: string) {
this.logger.log(`ユーザー作成: ${name}`);
}
}
// 利用例
const service = new UserService();
service.createUser("Hiroshi");
<?php
class Logger {
private static ?Logger $instance = null;
private function __construct() {}
public static function getInstance(): Logger {
if (self::$instance === null) {
self::$instance = new Logger();
}
return self::$instance;
}
public function log(string $message): void {
echo "[LOG]: {$message}\n";
}
}
class UserService {
private Logger $logger;
public function __construct() {
$this->logger = Logger::getInstance(); // Singleton
}
public function createUser(string $name): void {
$this->logger->log("ユーザー作成: {$name}");
}
}
// 利用例
$service = new UserService();
$service->createUser("Hiroshi");
class Logger:
_instance: "Logger" | None = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def log(self, message: str):
print(f"[LOG]: {message}")
class UserService:
def __init__(self):
self.logger = Logger() # 常に Singleton が返る
def create_user(self, name: str):
self.logger.log(f"ユーザー作成: {name}")
# 利用例
service = UserService()
service.create_user("Hiroshi")
✅ 解説
このコードは Singleton
パターン を使用して、Logger
クラスのインスタンスがアプリケーション全体で一意であることを保証している。
Singleton
パターンは、クラスのインスタンスが 1 つだけであることを保証し、そのインスタンスへのグローバルなアクセスを提供するデザインパターン。
1. Singleton パターンの概要
- Singleton: クラスのインスタンスを 1 つだけ生成し、それをグローバルに提供する
- このコードでは
Logger
が該当
- このコードでは
- Client:
Singleton
インスタンスを利用するクラス- このコードでは
UserService
が該当
- このコードでは
2. 主なクラスとその役割
Logger
Singleton
クラス- プライベートなコンストラクタを持ち、外部から直接インスタンス化できないようにする
getInstance
メソッドで唯一のインスタンスを取得- ログ出力機能を提供
UserService
- クライアントクラス
- コンストラクタ内で
Logger
のSingleton
インスタンスを取得し、ログ出力に使用
3. UML クラス図
4. Singleton パターンの利点
- インスタンスの一意性: アプリケーション全体で 1 つのインスタンスのみを保持
- グローバルアクセス:
getInstance
メソッドを通じて、どこからでもインスタンスにアクセス可能 - リソースの節約: 必要に応じてインスタンスを生成(遅延初期化)することで、リソースを節約
警告
- テストの難しさ: グローバルな状態を持つため、ユニットテストでモックや依存性注入が難しくなる場合がある
- 多用のリスク:
Singleton
を多用すると、コードが密結合になり、保守性が低下する可能性がある
この設計は、アプリケーション全体で共有されるリソース(例: ログ機能)を管理する際に非常に有効である。ただし、適切な場面で使用することが重要。