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