msHOWTO

14 Nisan 2012 Cumartesi

C# Design Patterns Singleton

Merhaba arkadaşlar.Bu makalemde size yazılım geliştirmenin sanatsal yönlerinden biri olan dessign patterns konularından Singleton ' ı anlatmaya çalışacağım elimden geldiğince.Eğer yazılıma yeni başlamamış iseniz belli bir süredir yazılım dünyasıyla haşır neşir olduysanız mutlaka duymuşsunuzdur.Daha önceki makalelerimde de bahsettiğim üzere yazılım dünyası gerçek dünya ile iç içedir.Ve biz yazılımcılar yazılımlarımızı gerçek dünya ile olan ilişkisini ne kadar yakın tutarsak o kadar profesyonelce kod geliştirmiş oluruz.Peki bir yazılım nasıl gerçek dünya ile ilişkili olabilir? Bunu sağlamak için kullanılan yöntemler vardır.İşte bu yöntemler design patterns dir. Peki gerçek dünya ile ilişkili olmasına ne gerek var sonuç olarak çalışıp çalışmadığına bakarım ben diyorsanız o sizin bileceğiniz bir yöntemdir fakat profesyonel yazılımlarda bu düşünceye rastlamak imkansızdır.Sonuçta design patterns konusu ileri OOP konusudur.Dolayısıyla OOP nin faydaları ortadadır.

Neyse biz konumuza geri dönelim . Design patterns Eric Gamma,Richard Helm,Ralph Johnson ve John Vlissides tarafından oluşturulmuştur.Design patterns guruları olarak bilinen bu 4 kişi Gangs Of Four(GoF) olarak da bilinirler.

GoF tasarımları 3 ana konu altında toplanırlar .

1-) Creatinal Patterns : Bu ana başlık altında toplanan desenler bir nesnenin oluşturulması ve yönetilmesi ile ilgili desenlerdir.Bu makalemde anlatacağım Singleton deseni de bu grup altına girmektedir.


  •   Abstact Factory
  •  Builder
  •  Factory Method
  •  Prototype
olarak desenler bulunmaktadır.Bu desenlerin bir kısmını ilerleyen makalelerimde anlatacağım .

2-) Behavioral Patterns : Bu grupta bulunan desenler ise belirli bir işi yapmak için farklı sınıfların nasıl birlikte davranacakları ile ilgilidir.


  • Command 
  • Iterator
  • Chain of Responsibilty
  • Interpreter
  • Mediator
  • Memento
  • Observer
  • Strategy
  • Visitor
  • State
  • Template Method
şeklinde desenler mevcuttur.

3-) Structural Patterns : Bu desenler çeşitli nesnelerin birbirleri arasındaki ilişkilerini ele alan desenlerdir.

  • Adapter
  • Composite
  • Decorator
  • Bridge
  • Proxy
  • Facade
  • Flyweight
şeklinde tasarımlar mevcuttur.Evet arkadaşlar design pattern lerin isimlerini ve genel olarak hangi amaçla kullandıklarını öğrendikten sonra asıl konumuza geri dönelim.

Singleton deseni yazdığınız bir uygulamanın hayatta kaldığı sürece bir class dan sadece bir örnek(instance) alınmasını garanti eden desendir.Bu tanımı bir örnekle anlatmak gerekirse diyelim ki bir veri tabanı uygulamanız var ve tek bir connection string iniz var.Bu connection string i her defasında instance alınarak oluşturulmasını istemiyorsunuz.Bir kere instance alınsın defelarca kullanılsın istiyorsunuz.İşte sizin aradığınız şey tam olarak Singleton desenidir.Hadi gelin singleton yöntemlerine bakalım ..

1.Yöntem ...


class Logger
        {
            private static object lockObject = new object();
            private static Logger instance=null;
            private Logger()
            {
                /* bu şeklide bir constructure oluşturulursa new kullanılarak ınstance alınamaz*/
            }
            public static Logger CreateInstance()
            {
               
                return instance;
                /*şeklinde tanımlama yaparak new olarak erişim sağlanmaz.Bu şekilde erişim sağlanır.Yeni bir Looger oluşturulmak isteniliyorsa bu method çağırılmalıdır.
                 
            
            public static Logger Instance
            {
                get { return instance ??/*bu operant ınstance değişkenini geri döndürmeye çalış eğer null ise bu operantın devamındaki komutu çalıştırır.*/ CreateInstance(); }
                
            }

        }


Şeklinde bir yöntem kullanılırsa eğer uygulamanız multi thread değilse gayet güzel çalışır.Multi thread olsa da çalışır fakat çok düşük bir ihtimal de olsa multi thread yapı kullandığınızda aynı anda Looger sınıfından instance alma isteği olabilir.İşte bu durumda sorun çıkar.Eğer multi thread yapısı kullacaksanız aşağıdaki yöntemi kullanmanızı öneriyorum arkadaşlar.

2. Yöntem ...

 class Logger
        {
            private static object lockObject = new object();
            private static Logger instance=null;
            private Logger()
            {
                /* bu şeklide bir constructure oluşturulursa new kullanılarak ınstance alınamaz*/
            }
            public static Logger CreateInstance()
            {
                if (instance==null)
                {
                    lock (lockObject)
                    {
                        instance = new Logger();
                        if (instance==null)
                        {
                            instance = new Logger();
                        }
                        /*bu blog içerisinde kitleme işlemi yapılır.Bu işlemle birlikte multi thread desteği de sağlanmış olunur.Bu yapının üzerine istenilen methodlar oluşturulur.*/
                    }
                    instance = new Logger();
                }
                return instance;
               
                 Static değişkenler Appdomain altında yaratılır.Logger sınıfı aynı anda hem main thread den hem de bizim uygulamamızda açılan threadler tarafından aynı anda yaratılmak ıstenebilir.Bu nedenle Logger nesnesı oluşturulduktan sonra kitlenir.Ve onu oluşturulan thread onu tekrar açana kadar bir daha açılmaz.
                 */
            }
          
            public static Logger Instance
            {
                get { return instance ??/*bu operant ınstance değişkenini geri döndürmeye çalış eğer null ise bu operantın devamındaki komutu çalıştırır.*/ CreateInstance(); }
               
            }

        }


Dikkat etmeniz gereken en önemli nokta yapıda kullanılan constructure olsun method olsun Static yapıda olmalıdır.

Umarım faydalı olmuştur.Bir sonraki makalemde görüşmek dileğiyle ...


3 yorum: