Tasarım Desenleri Türkçe Kaynak
  • Başlarken
    • 👋Giriş ve Tanışma
  • Nesne Yönelimli Programlama
    • Nesne Yönelimli Programlama Nedir ?
  • S.O.L.I.D
    • S.O.L.I.D Nedir?
  • Tasarım Desenleri
    • Tasarım Deseni Nedir ?
      • Creational (Oluşturucu) Tasarım Desenleri
        • 💎Singleton
        • 🏭Factory
        • 🏭🏭 Abstract Factory
        • ⛏️ Builder
        • 🐑Prototype
      • Structural (Yapısal) Tasarım Desenleri
        • 🔌Adapter
        • 🌉Bridge
        • 🌲Composite
        • 🎺Decorator
        • 📦Facade
        • 🌫️ Flyweight
        • 🔍Proxy
      • Behavioral (Davranışsal) Tasarım Desenleri
        • ⛓️ Chain of Responsibility
        • ⚔️Command
        • 🈂️ Interpreter
        • 🚶‍♂️ Iterator
        • 🗼Mediator
        • ↪️ Memento
        • 👓Observer
        • 🤔State
        • 💪Strategy
        • 📥Template
        • 🏃‍♀️ Visitor
  • Kapanış
    • Kapanış & Kaynakça
Powered by GitBook
On this page
  1. Tasarım Desenleri
  2. Tasarım Deseni Nedir ?
  3. Creational (Oluşturucu) Tasarım Desenleri

💎Singleton

PreviousCreational (Oluşturucu) Tasarım DesenleriNext🏭Factory

Last updated 2 years ago

Bir sınıfın sadece bir örneği olmalıdır ve bu örneğe global bir erişim noktası sağlanmalıdır.

Desene ait yukarıdaki diyagrama bakacak olursak, örneğini istediğimiz sınıfın;

  1. Constructor (oluşturucu metotu) private olmalıdır. Bunun amacı nesne oluşumunu tek yerden sağlamak. İstemcinin, new anahtar kelimesini kullanması engellemektir.

  2. Static bir değişken olmalıdır, referansı tutmak için.

  3. Tutulan referansa erişmek için bir metot olmalıdır, getInstance()

C# Kod Örneği:

class Database
{
    private static Database database;

    private Database()
    {

    }

    public static Database GetInstance()
    {
        if (database == null)
        {
            database = new Database();
        }

        return database;
    }
}
Database firstInstanceRequest = Database.GetInstance();
Database secondInstanceRequest = Database.GetInstance();

firstInstanceRequest == secondInstanceRequest // true

Desenin yukarıdaki durumu geçerli gibi duruyor fakat multi-thread uygulamalarda nesnenin daha örneğinin oluşmadığı esnada if (database == null) durumuna aynı anda birden fazla thread girebilir, bu sayede de o sınıfa ait birden fazla nesne örneği bulunur. Bu kısmı iyileştirme yolunda dillerin bize sağladığı yapıları kullanabiliriz. C# dilinde lock ile JAVA dili için de synchronized sayesinde aynı anda sadece bir yapının erişmesini sağlarız.

C# dili için GetInstance() metotunu düzenleyecek olursak aşağıdaki hali alacaktır.

public class Database
{
    private static Database database;
    private static Object _lockObject = new object();
    
    private Database()
    {

    }

    public static Database GetInstance()
    {
        if (database == null)
        {
            lock (_lockObject)
            {
                if (database == null)
                {
                    database = new Database();
                }
            }
        }

        return database;
    }
}

Bu tasarım deseninin JAVA ve diğer diller için olan uygulamasını bulabilirsiniz.

bu tasarım deseni için oluşturulmuş klasörde
singleton-design-pattern