「Singleton」という英単語は、「単独個体」を意味します。
つまり、「Singleton パターン」とは、唯一無二のオブジェクトを作成したい(保証したい)場合に適用します。
Singletonパターンのクラス図
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