Singleton パターン (あるオブジェクトが単一であること (複数オブジェクト生成されていないこと) を保証する)

[Singleton] という英単語は, [単独個体] を意味する.

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

役割

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

クラス図

Singleton パターンのクラス図

_images/designpattern-singleton012.gif

ソースコード

  1. Singleton.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
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;
  }
}
  1. Client.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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());
	}
    }
}

上記のプログラムの実行結果:

[wtopia Singleton]$ java Client
Singleton@15a8767
Singleton@15a8767
Singleton@15a8767
[wtopia Singleton]$ java Client
Singleton@b42cbf
Singleton@b42cbf
Singleton@b42cbf