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)
	}