頭脳一式

人の記憶なんて曖昧なもの。すべての情報を頭に記憶するなんてナンセンス。困ったらここに来ればいいじゃん?

【GoFデザインパターン】Singletonパターン

Singletonパターン

世の中には「世界に1つだけしか存在しないもの(2つ以上は存在しないもの)」がある。(例:地球、東京タワー、等)
オブジェクト指向の本質に鑑みれば「現実世界で1つだけ」のものは「JVM内の仮想世界でも1つだけであるべき」ということになる。
しかしクラスがある以上、newを行えば行った分だけインスタンスが生成されてしまう。
これを防ぎ、絶対に1回しかnewできないように唯一無二のインスタンスを生成する手法をsingletonパターンという。

JavaでSingletonパターン

以下のコードはJavaで実装した例。

public final class singleton {
    private static singleton theInstance;    //インスタンス保持用変数
    private singleton(){}                    //プライベートコンストラクタ
    public static singleton getInstance(){    //インスタンス取得用メソッド
        if (theInstance == null){
            theInstance = new singleton();
        }
        return theInstance;
    }
}

コンストラクタがprivateになっている意味は、
「privateとは他のクラスは利用できないこと」→「このコンストラクタは他クラスから呼びだせない。」→「自身でしかnewできない。」 ということ。
他クラスはgetInstance()メソッドを呼び出すことで、戻り値としてインスタンスが取得できる仕組みになっている。
複数回getInstance()メソッドを呼び出したとしても、2回目以降は既にインスタンスがあるのでnewされず、1回目にnewしたときのインスタンスが返るようになっている。
↓↓他クラスからインスタンスを取得する記述例↓↓

singleton obj = new singleton(); //この記述はコンストラクタが不可視でコンパイルエラー。
singleton obj1 = singleton.getInstance(); //この記述でインスタンスを取得できる。