Singleton Design Pattern

Sosyal medyada paylaşın

Singleton en çok kullanılan ve popüler olan tasarım desenlerinden biridir. Singleton Pattern yanlızca bir adet olması gereken obje yaratmak için kesinleşmiş ve test edilmiş en iyi yöntemdir. Creational Design Pattern sınıfında yer alır. Singleton patterninin amacı çalışma zamanında ilgili nesneden sadece bir adet instance olması ve bu nesneye global erişim sağlamasıdır. Genellikle paylaşılan bir kaynağa veya servise erişmek için kullanılır. Singleton static sınıfın aksine yanlızca örneğe ilk ihtiyaç duyulduğunda oluşturulur ve daha sonra tekrar kullanılır. Kendimden örnek vermem gerekirse oyun programlamada “Manager” scriptlerinde bu güne kadar gördüğüm hep singleton kullanılıyor oluşudur. Bir oyunda örneğin 4-5 adet Manager sınıfınız oluyor bu sınıflar adı üstünde yönetim sağlıyor ve kendisine instance üzerinden erişen singleton olmayan scriptler ile iletişim kuruyor. Örneğin UIManager, EventManager, GameManager….

Benimde kafamı çok karıştıran static vs singleton kısmına da değinmek istiyorum. Öncelikle static ve singleton armut ve elma gibi 🙂 farklı amaçlara hizmet ediyorlar iki kavramı karşılaştırmak pek doğru olmaz.

static üyeler sınıf düzeyinde ortak paylaşılan bilgilere veya yardımcı işlevlere erişmek için kullanılırken, singleton deseni bir sınıfın tek bir örneğini ve buna global erişimi sağlamak için kullanılır. Her iki kavram da farklı senaryolarda kullanışlı olabilir ve uygulamanın gereksinimlerine göre tercih edilebilir.

Bilginin tanım gibi havada kalmasını istemediğim için kendimden bir adet daha örnek vermek istiyorum. Oyun Programlama ile uğraşan herkesin bildiği “Trajectory” adlı çeşitli noktalar arasında eğri çizmemize olanak tanıyan, oyuncu bomba atarken bombanın hangi yörüngeyi izleyeceğini gösteren bir yardımcı sınıf yazmıştım. Adı üstünde yardımcı sınıf yani utilty yazarken static sınıf kullanmak daha mantıklı olacaktır çünkü bu yardımcı sınıflar bir durum tutmaz veya herhangi bir başka sınıfa bağımlılık gerektirmeden işlemlerini gerçekleştirir. Fakat bi GameManager’e bakacak olursak burda singleton kullanmak daha mantıklı olacaktır çünkü farklı sınıflardan bu manager’e erişmem gerekecek ve birden fazla örneği olmasını ve birden fazla sınıftan erişirken referans verip erişeceğim sınıf kadar ram’de kopyasının olmasını istemeyeceğimden singleton patternini uygulamak en doğru çözüm olacaktır.
Kendi kullandığım ve arkadaşımdan çaldığım 🙂 singleton sınıf örneğini aşağıda paylaşıyorum. Artık singleton yapmak isteyeceğiniz sınıfı örneğin “public class EventManager : SingletonBehaviour” şeklinde singleton’dan miras alarak yapabilirsiniz. EventManager sınıfına başka bir sınıftan erişmek için tek yapmanız gereken “EventManager.Instance” olacaktır.

using UnityEngine;

namespace Fade.Singleton
{
    public class SingletonBehaviour<T> : MonoBehaviour where T : SingletonBehaviour<T>
    {
        public static T Instance { get; private set; }
        protected virtual void Awake()
        {
            if (Instance != null && Instance != this)
            {
                Destroy(this);
                throw new System.Exception("An instance of this singleton already exists.");
            }
            else
            {
                Instance = (T)this;
            }
        }

    }
}


Gayet güzel anlattığımı düşünüyorum umarım sizde bu düşünceme katılırsınız .)