Singleton Design Pattern

Programlamada Tasarım Desenleri #1— Singleton Design Pattern

Vedat ERMIS
Kariyer.net Tech
3 min readAug 18, 2022

--

Bu seride programlamada tasarım desenlerini anlatmaya çalışacağım. Her Uygulama geliştiricinin bilmesi gereken tasarım desenleri tek tek örneklerle ele alacağız.

Nedir Bu Singleton ?
Bir nesnenin sadece bir örneği üretilip, bütün kullanıcıların aynı nesne örneğini kullanmasıdır.

Bu Pattern’ i Hangi Durumlarda Kullanmalıyız ?
Bir web sitesi yaptığımızı düşünelim. Bu web sitesinde satılan bir ürüne teklif verme fonksiyonu olsun ve verilen son teklif tutarı bütün kullanıcılar tarafından görülsün. Eğer bir kullanıcı yeni bir teklif verirse bu verilen teklif güncellenmesi ve herkesin yeni teklifi görmesi gibi bir senaryo düşünelim.

Programlamadaki en maliyetli işlemlerden biri de bir nesnesinin bir örneğinin yaratılmasıdır. Bir uygulamayı 5000 kişinin anlık olarak kullandığını düşünelim ve her kullanıcı business’ a yaptığı her istekte nesnenin yeniden bir örneği oluşur. İşte bu uygulamaya ciddi anlamda bir maliyettir.

Bu maliyetten kurtulmak için, eğer nesne sadece işlem yapıyorsa, bir değeri tutmak gibi bir görevi yoksa yani basit CRUD metotlarından ibaret ise, bu nesneyi Singleton olarak kullanabiliriz.

Kullanmamamız Gereken Durumlar ?
Singleton patterninde oluşturulan bir nesne dispose edilmediği sürece yada bir Web uygulamasında IIS restart edilmediği sürece bellekte yer kaplar. Eğer herkes aynı örneği kullanmayacaksa veya bir nesneyi uzun süre kullanmaya gerek kalmayacaksa Singleton tercih edilmemelidir.

Bu kadar Teorik bilgiden sonra şimdi işi pratiğe dökelim.

Basit bir konsol uygulaması ile Singleton Pattern’ i projemize uygulayalım.

BidManager adında bir sınıf açalım ve bu sınıfı Singleton olarak ayarlayalım.

Bu sınıf içerisinde private olarak bir constructor oluşturuyoruz. Bu sayede bu sınıfın bir örneğini new kelimesiyle üretilmesinin önüne geçiyoruz. Ardında da _bidManager adında static bir field oluşturuyoruz. CreateAsSingleton adında BidManager dönen static bir fonksiyon oluşturup içersine de _bidManager boş ise yeni bir BidManager örneği oluşturup bunu da geri döndüren kodumuzu yazıyoruz. Bu metod ve field static olduğu için her istekte aynı nesne kullanılacak ve uygulama sonlana kadar da bellekten silinmeyecektir.

Son olarak da Program.cs içerisinden Save medotunu çağıralım.

Biraz karışık anlatmış olabilirim fakat örneği kendiniz de yaptığınızda aslında zor olmadığını göreceksiniz.

Buraya kadar her şey güzel fakat bir problem var. _bidManager field’ i null iken aynı anda birden fazla istek gelirse ne olur ? Böyle bir durumda nesnenin birden fazla örneği oluşmuş olur ve biz bunun olmasını istemeyiz.

Peki bu sorunu nasıl çözeriz ?

Bu problemin çözümü için Thread yöneticilerinden biri olan lock komutunu kullanıyor olacağız.

Manager sınıfımızı yukarıdaki şekilde değiştiriyoruz. Eğer bir thread nesnemizi oluşturma aşamasına girdiyse, bu nesnenin üretme işlemini lock komutuna bırakıyor olacağız.

Lock komutu kısaca, bir işlemi lock içerisinde yaparsanız işlem bitmeden diğer thread’ler aynı blok içerisine girmezler.

Bizim birden fazla bu şekilde manager sınıfımız olduğunu düşünelim her manager için aynı işlemi mi yapacağız ? Tabi ki hayır. IOC Container’ ları bu işi gayet başarılı bir şekilde yapıyor.

--

--