5. Singleton パターン
- 2012/04/26 一部修正しました
- 5.1 Singleton パターンとは
- 5.2 サンプルケース
- 5.3 Singleton パターンのまとめ
5.1 Singleton パターンとは
第5章では Singleton パターンを紹介します。singleton とは一枚札のことです。一枚札とはトランプの一組に唯一のカードです。Singleton パターンとは、このような唯一の存在を保証するためのパターンです。
あるクラスのインスタンスが一つしかないことを保証したい場合があります。注意深く設計すれば、唯一のインスタンスを使いまわすことは可能でしょうが、このインスタンスが唯一であることを保障するものとはなりません。このような場合に、威力を発揮するのが Singleton パターンです。
Singleton パターンは、コンストラクタを private とすることで、他クラスから新たにインスタンスが生成されないような構造とすることで、インスタンスの生成を制御します。まずは、サンプルケースを考えて見ましょう。
5.2 サンプルケース
サンプルケースでは、図書館の貸出帳を考えて見ます。図書の貸出に当たって、その貸出帳がいくつあるのかわからないような状態では、、管理がとても難しくなります。例えば、「ゼロからはじめるJava」は貸し出し中ですか?と質問されたとき、貸出帳が何冊あるのか分からなければ、「この貸出帳によると、現在図書館にあるはずですが、貸出帳は他にもあるかもしれないし・・・」なんてことになりかねません。こんなとき「貸出帳はこの1冊のみ」と保証されていれば、本が貸し出し中であるのか、図書館にあるのかすぐに判断できます。
Singleton パターンはたった一つのクラスで構成されます。上記の図書貸出帳を表現する RegisterNote クラスをソースコードにしてみましょう。
public class RegisterNote{ private static RegisterNote registerNote = new RegisterNote(); private RegisterNote(){} public static RegisterNote getInstance(){ return registerNote; } }
RegisterNote クラスのインスタンスが唯一になるのがお分かりになるでしょうか?
まず、注目すべき点は、コンストラクタの識別子が private となっていることです。コンストラクタの識別子が private になっていることで、RegisterNote のインスタンスを外部から生成することができません。RegisterNote クラスのインスタンスが欲しいときには、
RegisterNote note = RegisterNote.getInstance();
として取得せざるを得ないようになっています。 クラス図を見てみましょう。
registerNote は、RegisterNote クラスが初期化されるときに生成されます。クラスが初期化されるタイミングは Java の言語仕様で定義されており、 初めてインスタンス化された時や、初めて static メソッドが呼び出されたタイミングなどに行われます。すなわち、このサンプルプログラムでは、staticメソッドであるgetInstance メソッドが初めて呼ばれるときにRegisterNode クラスが初期化され、そのときに一度だけRegisterNode クラスのインスタンスが生成されることになります。この後、getInstance メソッドが呼ばれたときには、既に生成されている registerNote オブジェクトが返されることになります。うまくできていますね。
5.3 Singleton パターンのまとめ
Singleton パターンの一般的なクラス図は以下のようになります
privateなコンストラクタ Singleton は Singleton クラスからしかアクセスできません。このコンストラクタが呼ばれるのは、その static フィールドが初期化され、static なメンバ変数 singleton が生成される時のみです。他クラスから Singleton のインスタンスを得るためには、getInstanceメソッドを利用する他ありません。
[引用] 『Java言語で学ぶ デザインパターン入門』(結城浩 ソフトバンクパブリッシング株式会社出版 2001年)