Webアプリ開発エンジニアのための技術情報サイト「テックスコア」

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();

として取得せざるを得ないようになっています。 クラス図を見てみましょう。

クラス図1

registerNote は、RegisterNote クラスが初期化されるときに生成されます。すなわち、このサンプルプログラムでは、初めてgetInstance メソッドが呼ばれるときに生成されることになります。この後、getInstance メソッドが呼ばれたときには、RegisterNote が初期化される時に生成された registerNote オブジェクトが返されることになります。うまくできていますね。

5.3 Singleton パターンのまとめ

Singleton パターンの一般的なクラス図は以下のようになります

Singleton パターンのクラス図
[引用] 『Java言語で学ぶ デザインパターン入門』(結城浩 ソフトバンクパブリッシング株式会社出版 2001年)

privateなコンストラクタ Singleton は Singleton クラスからしかアクセスできません。このコンストラクタが呼ばれるのは、その static フィールドが初期化され、static なメンバ変数 singleton が生成される時のみです。他クラスから Singleton のインスタンスを得るためには、getInstanceメソッドを利用する他ありません。



次のページへ TECHSCOREのTOPページへ 次のページへ
TECHSCORE PR
PR
PR
PR
PR
PR

techscore(トップページへ)
TECHSCORE書店
TECHSCOREトップページJavaSQLXMLリッチクライアントモデリングセマンティックWebその他技術Tuigwaa