Design Patterns : Singleton 2018/4

• 1つの実行環境中で1つのインスタンスのみを生成するパターン。
• シングルトンインスタンスと呼び出すクラスとの関係が1:Nとなるため同期を考える必要がある。

UML
Singleton
-singleton
-Singleton +getInstance

プライベートフィールドとプライベートコンストラクタをもつシングルトンクラス
public class Singleton {

    /* Private static field */
    private static final Singleton singleton = new Singleton();
    
    /* Private Constructor */
    private Singleton() {
        System.out.println("Constructor has been called.");
    }
    
    public static Singleton getInstance() {
        System.out.println("getInstance has been called.");
        System.out.println(singleton.hashCode());
        return singleton;
    }
}

シングルトンクラスを使用するテストクラス
public class TestRun {

    public static void main(String[] args) {
        
        System.out.println("Start");
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        Singleton singleton3 = Singleton.getInstance();
        System.out.println("End");
    }
}

テストクラスの実行結果
Start
Constructor has been called. /* 最初のgetInstance呼出の際にコンストラクタが呼ばれる */
getInstance has been called.
2051450519
getInstance has been called.
2051450519
getInstance has been called. /* 3回とも同じインスタンスが呼ばれている。 */
2051450519
End