Bu Sayfayı Paylaş:

Kavram

Singleton Tasarım Şablonu

Tanım: Bir uygulamada bir sınıfın (class) uygulama boyunca sadece tek bir nesnesinin (instance) yaratılması ve her zaman aynı nesnenin kullanımasını sağlayan tasarım şablonu

Örnek

En Basit Singleton Tasarım Şablonu Örneği

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. 


Örnek

Singleton Örneği

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.


Örnek

Thread Safe Singleton Örneği

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.


Örnek

Bir Singleton Örneği

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

 


İpucu

Singleton Sınıf Yapılması

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. 





Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir