Aşağıdaki class en basit Singleton tasarım şablonu örneğidir :
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; } }
Configuration sınıfı ilk defa çağrıldığı zaman yaratılacak ve diğer çağırımlarda yaratılmayacaktır. Nesne aşağıdaki gibi yaratılabilir :
Configuration conf=Configuration.getInstance();
Yukarıdaki nesne daha sonra aynı şekilde tekrar çağrıldığında yaratılmış olan nesne verilecektir.
Not : Bu class "thread safe" değildir. Yani farklı thread'ler aynı anda çağırdığında farklı instance'ların yaratılma tehlikesi bulunmaktadır. Thread safe yapmak için getInstance methodunu synchronized yapmak gerekmektedir. Ancak synchronized performansı aşırı derece düşürmektedir.
Aşağıdaki class Singleton tasarım şablonu örneğidir :
public class Message { private final static Message INSTANCE = new Message(); private Message() { System.out.println("Nesne yaratildi..."); } public static Message getInstance() { return INSTANCE; } }
Message sınıfı ilk defa çağrıldığı zaman yaratılacak ve diğer çağırımlarda yaratılmayacaktır. Nesne aşağıdaki gibi yaratılabilir :
Message msg=Message.getInstance();
Yukarıdaki nesne daha sonra aynı şekilde tekrar çağrıldığında yaratılmış olan nesne verilecektir.
Aşağıdaki class thread safe Singleton tasarım şablonu ö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; } }
Util sınıfı ilk defa çağrıldığı zaman yaratılacak ve diğer çağırımlarda yaratılmayacaktır. Nesne aşağıdaki gibi yaratılabilir :
Util util=Util.getInstance();
Yukarıdaki nesne daha sonra aynı şekilde tekrar çağrıldığında yaratılmış olan nesne verilecektir.
Aşağıda Singleton tasarımını kullanan bir örnek görülmektedir :
public class Test {
private static Test instance=null; private Test() {} public static Test getInstance(){ if(instance==null){ synchronized (Test.class) { if(instance==null){ instance=new Test(); } } } return instance; } }
getInstance metodu synchronized yapılarak thread-safe olması sağlanabilir. Ancak bu performansı düşürecektir. Bir altarnatif yöntem yukarıdaki gibi yapmaktır. instance'ın null olup olmadığı anlaşılana kadar synchronized yapılmamaktadır. instance'ın null olduğu anlaşılınca sınıf synchronized haline getirilmekte ve Test nesnesinin yaratılması beklenmektedir. synchronized blok içinde de bir null kontrolü koyulmuştur. Bu şekilde ikinci bir nesnenin yaratılması engellenmiştir
Bir sınıfın Singleton olması için aşağıdaki işlemleri yapılması gerekmektedir :
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; } }
public class Message { private final static Message INSTANCE = new Message(); private Message() { System.out.println("Nesne yaratildi..."); } public static Message getInstance() { return INSTANCE; } }
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.