
Bir sınıfın yalnızca bir örneğe sahip olmasını ve bu örneğe her yerden erişebilmemizi sağlamaktadır . Yaratıcı(Creational) bir tasarım modelidir. Nesne yaratmayla ilgili şablonları yaratıcı tasarım şablonları olarak gruplayabiliriz. Singleton tasarım şablonunu aşağıda örnekle detaylandıracağız.

Olay
Redis anahtar(key)-değer(value) şeklinde kayıt yapabildiğimiz bellek kullanımlı bir veri deposudur. Redis kullandığımız 6 tane ayrı fonksiyondan oluşan bir backend servisimiz bulunmaktadır. Bu fonksiyonlar gelen kullanıcı inputunu bir anahtar olarak alıp Redis’te sorgulayıp bulursa kullanıcıya değerini dönecektir, şayet böyle bir anahtar bulunamadıysa kayıt işlemi gerçekleşecektir.

Problem
Her bir fonksiyon Redis sınıfını çağırdığında yeni bir instance üretilecektir. Yeni bir instance oluşturulduğunda Redis servisimize bağlantı isteği bulunacaktır. 6 Fonksiyon çalıştığında her defasında bağlantı oluşturulacak, sunucuya bağlantı gerçekleştirecek ve daha sonra fonksiyonun işlemi bittiğinde imha olacaktır. Özetle her bir fonksiyon çalıştığında bağlantı kurulması ve Redis instance tekrar tekrar üretilmesi servislerimizin performansını etkilemektedir.
Problem yaratan Redis sınıfımız:
Çözüm
Redis için tekrar tekrar instance oluşturulmayacak şekilde yapı kurmamız gerekiyor. Tek bir instance oluşturulacak ve servis durdurulana kadar o instance üzerinden işlem yapılması gerekmektedir. Bunu mümkün kılan şablona Singleton diyoruz.
Çözüm ürettiğimiz Redis sınıfımız:
Redis sınıfımıza instance adında değişken ekledik, bu değişkenin statik, private ve Redis sınıfı tipinde olacağını belirttik. Fonksiyonlar new parametresiyle erişip yeni bir instance oluşturmasını engellemek amacıyla kurucu metodumuzu(constructor) private yaptık bu şekilde sadece sınıf içersinde erişebiliyor olacağız. Böylelikle Redis instance isteyen fonksiyonlar sadece statik olan getInstance() metodunu kullanarak erişebilecektir. getInstance metodu çalıştırıldığında bir instance var mı kontrolü sağlamaktadır, şayet yoksa yeni bir instance oluşturup statik instance değişkenine aktaracaktır daha sonra fonksiyona instance dönüşü yapılmaktadır. Böylelikle birden fazla instance oluşumunu engellemiş bulunduk.

Özetle
Singleton Design Pattern, tek bir instance üretmek istediğimizde ve bu instance’a erişmek istediğimizde kullanmaktayız. Özellikle bağlantı(connection) ve konfigürasyon(config) gerektiren durumlarda aklımıza gelmesinde fayda var 🙇♂️