Singleton Design Pattern c# nedir

Singleton design deseni kullanılarak, bir programın yaşam süresince belirli bir sınıfın örneği(instance) yalnızca birkez oluşturulur. Bu desen sayesinde yeni örnek(instance) oluşturma yerine referansı kullanılır.

Bu referansa global düzeyde erişim sağlanır. Örnek(instance) oluşturma işlemi ilgili sınıf içerisinde static özellik(property) veya static metot ile yapılmaktadır. Oluşan örnek(instance) private erişim türündeki özelliğe atanır.

1. Örnek

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Config config = SingletonDesignPattern.GetConfig();
            config.connectionString = "Persist Security Info=False;User ID=*****;Password=*****;Initial Catalog=AdventureWorks;Server=MySqlServer";
            Console.WriteLine(SingletonDesignPattern.GetConfig().connectionString);
            Console.ReadKey();
        }
    }
    public class SingletonDesignPattern
    {
        private static Config config = new Config();

        public static Config GetConfig()
        {
            return config;
        }
    }
    public class Config
    {
        public string connectionString { get; set; }
    }
}

2. Örnek

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Config config = SingletonDesignPattern.GetConfig;
            config.connectionString = "Persist Security Info=False;User ID=*****;Password=*****;Initial Catalog=AdventureWorks;Server=MySqlServer";
            Console.WriteLine(SingletonDesignPattern.GetConfig.connectionString);
            Console.ReadKey();
        }
    }
    public class SingletonDesignPattern
    {
        private static Config config = new Config();

        public static Config GetConfig
        {
            get
            {
                return config;
            }     
        }
    }
    public class Config
    {
        public string connectionString { get; set; }
    }
}

private erişim türünde ve static tanımlanan config örneğine(instance), geri dnüş değeri olarak 1. örnekte public erişim türünde ve static tanımlanan GetConfig() metodundan, 2. örnekte public erişim türünde ve static tanımlanan GetConfig özelliğinden(property) erişilmektedir.

İstenildiği zaman config örneğini(instance) oluşturabilirsiniz. Sınıf çağrıldığı zaman değil ilgili metot çağrıldığı zaman config örneği(instance) oluşturulabilir.

3. Örnek

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Config config = SingletonDesignPattern.GetConfig();
            config.connectionString = "Persist Security Info=False;User ID=*****;Password=*****;Initial Catalog=AdventureWorks;Server=MySqlServer";
            Console.WriteLine(SingletonDesignPattern.GetConfig().connectionString);
            Console.ReadKey();
        }
    }
    public class SingletonDesignPattern
    {
        private static Config config;

        public static Config GetConfig()
        {
            if (config == null)
                config = new Config();

            return config;    
        }
    }
    public class Config
    {
        public string connectionString { get; set; }
    }
}

GetConfig() metotu her çağrıldığında Config sınıfının örneği(instance) config, tekrar oluşmasını engellemek için if (config == null) koşulunu kullanırız.

Çok kanallı (multi thread) bir uygulamada Config sınıfının örneğinin(instance) tekrar oluşması engellenmelidir. lock ifadesini(statement) kullanarak çok kanallı(Thread) akışındaki işlev tek kanal yapılır. Diğer kanallardaki işlemler durdurulmuş olur. Kanallar(Thread) beklemeye alınır.

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Config config = SingletonDesignPattern.GetConfig();
            config.connectionString = "Persist Security Info=False;User ID=*****;Password=*****;Initial Catalog=AdventureWorks;Server=MySqlServer";
            Console.WriteLine(SingletonDesignPattern.GetConfig().connectionString);
            Console.ReadKey();
        }
    }
    public class SingletonDesignPattern
    {
        private static Config config;
        private static object checkMultiThread = new object();
        public static Config GetConfig()
        {
            if (config == null)
            {
                lock (checkMultiThread)
                {
                    if (config == null)
                        config = new Config();
                }
            }
               
            return config;    
        }
    }
    public class Config
    {
        public string connectionString { get; set; }
    }
}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir