
しかしプログラマ任せにすると、間違ってnewを複数回呼び出してしまうかもしれません。
絶対ではありません。
このパターンを適用すると、
指定したクラスのインスタンスが絶対に1つしか存在しないことを保証することができます。
■クラス図
■サンプルソース
実装方法は簡単です。
public class Hoge {
/* 唯一のインスタンス。 */
private static final Hoge instance = new Hoge();
/**
* コンストラクタ。
*/
private Hoge() {
}
/**
* このクラスの唯一のインスタンスを返す。
*/
public static Hoge getInstance() {
return instance;
}
}
いわゆる「自己参照」の形を取ります。
void Test() {
/* new できません。コンパイルエラーとなります。 */
// Hoge hoge = new Hoge();
// この時点で Hoge インスタンス生成&返却
Hoge hoge1 = Hoge.getInstance();
// 同じインスタンス返却
Hoge hoge2 = Hoge.getInstance();
if (hoge1 == hoge2) {
System.out.println("同じインスタンスです。");
}
}
Hoge.getInstance() を呼び出すことで Hoge インスタンスが返ってきます。
public class Hoge {
/* 唯一のインスタンス。 */
private static final instance; // 初期化しない (= null と同義)
/**
* コンストラクタ。
*/
private Hoge() {
}
/**
* このクラスの唯一のインスタンスを返す。
*/
public static Hoge getIntance() {
if (instance == null) { // null だったら new する
instance = new Hoge();
}
return instance;
}
}
これは、C言語で書かれていたものをJavaへ単純にベタ移植したものですが、
状況によっては期待通りに動きません。