Singleton Design Pattern (Tasarım Örüntüsü)

Metin Alnıaçık
2 min readOct 3, 2018

--

Singleton design pattern, creational design pattern kategorisindedir.

Bu tasarım örüntüsündeki amaç, bir class’tan sadece bir instance yaratılmasını sağlar. Yani herhangi bir class’tan bir instance yaratılmak istendiğinde, eğer daha önce yaratılmış bir instance yoksa yeni yaratılır. Daha önce yaratılmış ise var olan instance kullanılır.

En yaygın singleton tasarım örüntüsü örneklerinden biri Logger’dır. Bir başka örnek verecek olursak DataSource güzel bir örnektir.

UML

Bir class’ın singleton tasarım örüntüsüne uygun olması için temelde üç adım vardır;

  • Constructor private olmalı. Bu yapılan işlem new ile nesne oluşturulmasını engeller.
  • Class ile aynı türde static bir member oluşturulur.
    Örneğin;
    class SingletonExample {
    private static SingletonExample instance;
    }
  • Static member’a ulaşmak için static bir metot oluşturulmalıdır.
    Örneğin;
    public static Singleton getInstance() { … return instance; }

Şimdi UML diyagramı çizilmiş olan örneği kodlayalım;

5. satırda, class ile aynı türde static bir member mevcuttur.
7. satırda, private constructor tanımlanmıştır.
9. satırda ise, static member’a ulaşmak için kullanılan static metot mevcuttur.

Instance’ları new ile yaratmıyoruz. Bunun yerine getInstance metodunu kullanıyoruz. Bu metot ise bize her defasında aynı instance’ı veriyor.
Bunu oluşturduğumuz instance’ların adreslerine bakarak görebilirsiniz.
Programın konsol çıktısı aşağıdaki gibidir;

Yukarıdaki çıktıya bakıldığında adresler aynıdır.
Yukarıdaki yapmış olduğumuz örnek lazy initialization’dır. Yani getInstance metodu çağırılana kadar instance yaratılmaz. Birde eager initialization vardır. Şimdi o örneği inceleyelim;

Eager initialization tanımlama iki şekilde yapılabilir. Birinci yöntem direkt olarak new yaparak diğer yöntem ise static blok kullanarak yapılabilir.

5. satıra bakıldığında new SingletonExample… şeklinde tanımlanmıştır.

7. satırda static blok ile initialization işlemi yapılmıştır.

Test class’ı çalıştırılıp konsoldaki sonucuna bakıldığında sonuç birinci yapılmış olan örnek ile aynıdır.

Örneğin tamamına github adresimden ulaşabilirsiniz.

İyi günler,
Bol kodlamalar :)

--

--