あるクラスに対してインスタンスが1つだけ生成されるよう制限する
インスタンスへのグローバルアクセスポイントを提供しながら、 クラスにインスタンスが1つしかないことを保証できる創造的なデザインパターン
プログラム内のクラスですべてのクライアントが使用できるインスタンスが 1つだけである必要がある場合はこれ
- クラスのインスタンスが1つしか生成されない
- グローバルアクセスポイント取得
- 初めて要求されたときに初期化
- 単一責任の原則に違反。一度に2つの問題を解決する
- プログラムのコンポーネントがお互いについてあまりにも多くを知っている場合、悪い設計を隠すことができる
- 複数のスレッドがシングルトンオブジェクトを複数回作成しないように、マルチスレッド環境では特別な処理が必要
- 本当に1つでいいのか?要件の変化を織り込んでない
- ユニットテストの妨げになりがち
- mockに差しかえれない
- どのような順序でもテストが可能でないといけない
- singletonを明示的に殺す方法はない
- 複数のsingletonがある場合、どの順序でクリーンアップされるかは決まってない
- 依存関係上にあると...
- Facadeは多くの場合に変換することができるので、基本Facadeを使う
- Flyweightと似てるが違う
- Singletonはインスタンス1つだけだが、Flyweightは複数持てる
- Singletonオブジェクトは可変。Flywightオブジェクトは不変
- 必要なインスタンスが絶対に1つだけと確信したら使う
- あとDIコンテナに実装してあげると依存関係気にしなくていいよね
- 本の貸出しリスト
- Ruby, Perlの本は貸出し中かどうか、貸出しリストが複数あったらわからないから
- singletonパターンを使って、貸出しリストはこの1冊のみ と保証する