オブジェクト指向のこころ 第21章の練習問題の解答をまとめてみる。
基礎
Singletonとは,どういったタイプのパターンなのでしょうか?パターンの分類では,どのカテゴリに属するのでしょうか?
生成に関するパターン.
Singletonパターンの目的を答えてください.
クラスのインスタンスを1つだけに保証するとともに,それにアクセスするための大域的な窓口を提供する.
(p.308)
Singletonの責務は,いくつのオブジェクトを生成することでしょうか?
1つ.
Singletonは,オブジェクトを生成するための特殊なメソッドを使用します.このメソッドの特殊な点を解説してください.
- このメソッドが呼び出された際,オブジェクトがすでに実体化されているかどうかをチェックする.
- 実体化されている場合,このメソッドはそのまま該当オブジェクトの参照を返す.
- 実体化されていない場合,このオブジェクトの実体化を行い,そのインスタンスの参照を返す.
- このメソッドを呼び出す以外の方法ではオブジェクトを実体化できないようにするため,コンストラクタをprotectedかprivateで宣言する.
(p.308)
SingletonパターンとDouble-Checked Lockingパターンは,どのようにして使い分けるのでしょうか?
2つのパターンの違い
- Singletonパターンはシングルスレッドアプリケーションで使用される
- Double-Checked Lockingパターンはマルチスレッドアプリケーションで使用される
Double-Checked Lockingパターンは2つのスレッドが同じタイミングでオブジェクトを生成しようとしたときの,2重生成に対するものである.
応用
オブジェクトを1つだけ実体化させるという責務は,該当オブジェクト以外のオブジェクトに課したほうがよいのでしょうか?その答えと理由を述べてください.
該当オブジェクトに課したほうがよい. なぜかというと,振る舞いをカプセル化することができるから. Singletonパターンによって,オブジェクトの実体化の責任をもたせることが可能になる.
他のオブジェクトから,該当オブジェクトがすでに存在しているかを気にする必要もなくなる. システムの巨大化,複雑化するにしたがって,すべてのオブジェクトに対して1つ生成されているかを管理するのは,起動時の効率が悪くなる.