Skip to content

Latest commit

 

History

History
40 lines (33 loc) · 2.16 KB

README.md

File metadata and controls

40 lines (33 loc) · 2.16 KB

Singleton

あるクラスに対してインスタンスが1つだけ生成されるよう制限する

インスタンスへのグローバルアクセスポイントを提供しながら、 クラスにインスタンスが1つしかないことを保証できる創造的なデザインパターン

プログラム内のクラスですべてのクライアントが使用できるインスタンスが 1つだけである必要がある場合はこれ

メリット

  • クラスのインスタンスが1つしか生成されない
  • グローバルアクセスポイント取得
  • 初めて要求されたときに初期化

デメリット

  • 単一責任の原則に違反。一度に2つの問題を解決する
  • プログラムのコンポーネントがお互いについてあまりにも多くを知っている場合、悪い設計を隠すことができる
  • 複数のスレッドがシングルトンオブジェクトを複数回作成しないように、マルチスレッド環境では特別な処理が必要
  • 本当に1つでいいのか?要件の変化を織り込んでない
  • ユニットテストの妨げになりがち
    • mockに差しかえれない
    • どのような順序でもテストが可能でないといけない
  • singletonを明示的に殺す方法はない
  • 複数のsingletonがある場合、どの順序でクリーンアップされるかは決まってない
    • 依存関係上にあると...

他パターンとの関係性

  • Facadeは多くの場合に変換することができるので、基本Facadeを使う
  • Flyweightと似てるが違う
    • Singletonはインスタンス1つだけだが、Flyweightは複数持てる
    • Singletonオブジェクトは可変。Flywightオブジェクトは不変

ポイント

  • 必要なインスタンスが絶対に1つだけと確信したら使う
  • あとDIコンテナに実装してあげると依存関係気にしなくていいよね

例題

  • 本の貸出しリスト
  • Ruby, Perlの本は貸出し中かどうか、貸出しリストが複数あったらわからないから
  • singletonパターンを使って、貸出しリストはこの1冊のみ と保証する