Singleton パターン

「Singleton」という英単語は、「単独個体」を意味します。

つまり、「Singleton パターン」とは、唯一無二のオブジェクトを作成したい(保証したい)場合に適用します。


役割り

1. Singleton(単独個体)
唯一のオブジェクトを返す役です。getInstanceメソッドではいつも同じオブジェクトを返します。
2. Client(利用者)
「Singleton」パターンを適用したクラスを利用し処理します。

▲PageTop

クラス図

Singletonパターンのクラス図

Singletonパターン クラス図

▲PageTop

サンプル

ソースコード

1. Singleton.java

public class Singleton {
    private static Singleton singleton;
    private Singleton(){}
    public static Singleton getInstance(){
        /** 一般的に「Singleton」パターンというと左記のようなgetInstanceメソッドの実装で知られていますが、
            厳密には「Singleton」パターンにはなっていません。なぜなら、マルチスレッドのアクセスを考慮すると、
            このままでは、複数のオブジェクトが生成される可能性があるためです。 */
        if (singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

↓マルチスレッドアクセスを考慮した場合

public class Singleton {
    /** マルチスレッドを考慮すると、getInstanceメソッドに「Synchronized」修飾子を付け、同期化させるか、
        もしくは、この様にクラスフィールドでオブジェクトを生成をするかのいづれかの方法を取る必要があります。 */
    private static Singleton singleton = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return singleton;
    }
}

2. Client.java

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

public class Client {
    public static void main(String[] args){
        List<Singleton> list = new ArrayList<Singleton>();
        list.add(Singleton.getInstance());
        list.add(Singleton.getInstance());
        list.add(Singleton.getInstance());
        Iterator<Singleton> it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}

実行結果

C:\sample\desin_pattern\singleton>javac Client.java [Enter]

C:\sample\desin_pattern\singleton>java Client [Enter]
Singleton@19821f
Singleton@19821f
Singleton@19821f
        

▲PageTop