[Singleton] という英単語は, [単独個体] を意味する.
つまり, [Singleton パターン] とは, 唯一無二のオブジェクトを作成したい (保証したい) 場合に適用する.
唯一のオブジェクトを返す役. getInstance メソッドではいつも同じオブジェクトを返す.
[Singleton] パターンを適用したクラスを利用し処理する.
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 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