Singleton
- クラス1つのインスタンスのみを持つことを保証し、このインスタンスへアクセスするためのグローバルな方法を提供するパターン
- 開発者は一度しかnewしてはならないといったことを気にしなくて良い
class Singleton {
private static instance: Singleton;
private constructor() {}
static getInstance() {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
}メリット・デメリット
※アンチパターンと呼ばれることが多い
メリット
- クラスが1つのインスタンスしか持たないことを保証できる
- インスタンスが1つなのでメモリ効率が良い
- 最初にインスタンス化されたら以降は使い回しなので、生成コストがかからない
デメリット
- 依存関係が非常にわかりにくくなる
- Singletonが状態を保つ場合、密結合になる
- 単体テストの実行が困難
- マルチスレッドでのSingletonの扱いが難しい
用途
- プログラム内のクラスで、全てのクライアントが使用できるインスタンスを必ず1つだけに制限したい場合
- ロギング
- キャッシュ管理
- コンフィグ
- データベース接続ドライバ
デザインパターンの種類
生成に関するデザインパターン
例(Mermaid)
- class自体はconstructor自体をprivateに持っておきgetInstance()内でのみ作成する
- インスタンスをクラスのprivate static変数に格納しておき隠蔽している
classDiagram class Singleton { -instance Singleton -Singleton() getInstance() Singleton$ } class Logger { -instance: Logger -Logger() getInstance() Logger$ +output(content string) }