シングルトンパターン
シングルトンパターン(Singleton Pattern) は、特定のクラスのインスタンスが一つだけであることを保証するデザインパターンです。アプリケーション全体で共有するオブジェクト(例えば設定管理、ロギング、データベース接続など)に利用されることが多いです。
シングルトンパターンの利点は、システム全体で同じインスタンスを共有することによって、不要なメモリ使用を抑えたり、データの整合性を保ったりできる点にあります。
TypeScriptでのシングルトンパターンの実装
TypeScriptを使ってシングルトンパターンを実装するには、以下の3つのポイントに注意します:
- コンストラクタをprivateにする - クラスの外部から直接インスタンスを作成できないようにする。
- 静的なインスタンスを保持するプロパティを作成する - クラス内で唯一のインスタンスを保持するプロパティ。
- インスタンスを返すための静的なメソッドを提供する - インスタンスが既に存在する場合はそれを返し、存在しない場合は新たに作成する。
以下にTypeScriptでのシングルトンパターンの例を示します。
シングルトンクラスの例
typescript
class Singleton {
// クラス内で唯一のインスタンスを保持するための静的プロパティ
private static instance: Singleton;
// コンストラクタをprivateにして外部からのインスタンス化を禁止
private constructor() {
console.log('Singleton instance created');
}
// インスタンスを取得するための静的メソッド
public static getInstance(): Singleton {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
// サンプルメソッド
public sayHello(): void {
console.log('Hello from Singleton instance');
}
}
// シングルトンインスタンスの取得
const singletonA = Singleton.getInstance();
singletonA.sayHello(); // "Hello from Singleton instance"
const singletonB = Singleton.getInstance();
singletonB.sayHello(); // "Hello from Singleton instance"
// インスタンスが同じであることの確認
console.log(singletonA === singletonB); // true
解説
唯一のインスタンスを保持するプロパティ (
private static instance: Singleton
)- クラス内に静的なプロパティを定義し、このプロパティが唯一のインスタンスを保持します。
コンストラクタを
private
に設定- クラス外部から新たにインスタンスを作成することを防ぐために、コンストラクタを
private
にします。これにより、new Singleton()
のようにインスタンス化することはできなくなります。
- クラス外部から新たにインスタンスを作成することを防ぐために、コンストラクタを
getInstance
メソッドでインスタンスを提供getInstance
メソッドは、クラスのインスタンスを返す静的メソッドです。インスタンスが既に存在する場合はそれを返し、存在しない場合は新たにインスタンスを作成して返します。
使用例
シングルトンパターンは、以下のような状況で役立ちます:
- 設定管理クラス:アプリケーション全体で共通の設定を管理するクラス。
- ロギングクラス:複数の箇所からログを取るために使用されるクラス。
- リソース管理クラス:データベース接続など、共有リソースの管理を行うクラス。
たとえば、ログ記録を行うクラスにシングルトンパターンを適用すれば、どこからでも同じインスタンスを通じてログを記録でき、複数のインスタンスによる記録の不整合を防ぐことができます。
注意点
シングルトンパターンは便利ですが、注意点もあります。
- テストが難しい:グローバルに1つしか存在しないため、ユニットテストでモック化するのが難しくなることがあります。
- 密結合を招く可能性:シングルトンを使用すると、コードの依存関係が強くなり、柔軟性が損なわれることがあります。そのため、依存性の注入(Dependency Injection)を組み合わせると良い場合もあります。
シングルトンパターンは、その用途に適している場合に限り有効です。慎重に使用することで、コードの一貫性を保ちながらも効率的な設計が可能となります。
まとめ
シングルトンパターンは、特定のクラスのインスタンスが一つだけであることを保証し、設定管理やリソース管理のような共有オブジェクトに有用です。同じインスタンスを再利用することで、メモリを節約し、データの一貫性を保つことができます。ただし、使用する際はテストの難しさや結合度の高さに注意し、適切な場面でのみ利用することが大切です。