Bir sınıfın Singleton olması için aşağıdaki işlemleri yapılması gerekmektedir :
- Class'a private olan boş kurucu eklenmelidir. Bu şekilde new operatör'ü ile farklı nesnelerin yaratılması engellenmiş olur.
- Class içinde o class'ın bir instance'ı olmalıdır. Bu instance sadece bir kere yaratılmalıdır.
- Class içinde public static bir method ile nesne talep edilmelidir.
Aşağıda basit bir örnek bulunmaktadır :
public class Configuration {
private static Configuration instance = null;
private Configuration() {}
public static Configuration getInstance() {
if(instance==null){
System.out.println("Nesne yaratildi...");
instance=new Configuration();
}
return instance;
}
}
Yukarıda görüldüğü gibi private boş bir kurucu , static bir "instance" değişkeni bulunmaktadır. Ve bu class'tan bir nesne talep edildiğinde static getInstance methodu çağrılmalıdır. Bu method instance'ın yaratılıp yaratılmadığını kontrol etmeli eğer yaratılmadı ise yaratmalı , yaratılmış ise var olan nesneyi döndürmelidir.
Not : Yukarıdaki örnek thread safe değildir. Aynı anda farklı thread erişiminde farklı instance'ların yaratılma tehlikesi bulunmaktadır. Bunu engellemek için getInstance methodunu synchronized yapmak gerekmektedir. Ancak synchronized performansı aşırı derecede düşürmektedir.
Diğer bir thread-safe yapılış şekli aşağıdaki gibidir :
public class Message {
private final static Message INSTANCE = new Message();
private Message() {
System.out.println("Nesne yaratildi...");
}
public static Message getInstance() {
return INSTANCE;
}
}
Burada farklı olarak instance static olarak yaratılmaktadır. instance değerinin null olup olmadığını kontrol yapmaya gerek yoktur.
Aşağıdaki yöntemde thread safe bir yöntem örneğidir :
public class Util {
private Util() { }
private static class SingletonHolder {
public static final Util instance = new Util();
}
public static Util getInstance() {
return SingletonHolder.instance;
}
}
Burada ayrı bir SingletonHolder class'ı kullanılmaktadır.