1. Singleton Pattern Nedir

Singleton Pattern, bir sınıfın yalnızca bir örneğe sahip olduğunu ve bu örneğe erişim noktası sağlayarak sınıfın yalnızca bir örneğe sahip olmasını garanti eden bir yaratıcı tasarım desenidir. Singleton deseni, kaynakların paylaşılması gereken senaryolarda veya belirli bir örneğe erişimin kontrol edilmesi gereken durumlarda yaygın olarak kullanılır.

2. Singleton Pattern'ın Özellikleri ve Avantajları

Singleton Pattern'ın aşağıdaki özellikleri ve avantajları vardır:

  • Sınıfın yalnızca bir örnek nesneye sahip olduğunu garanti eder
  • Harici kodun örnek alması için global bir erişim noktası sağlar
  • Örneklerin tekrar tekrar oluşturulmasını önleyerek sistem kaynaklarını korur

3. Singleton Pattern Uygulama Senaryoları

Singleton Pattern aşağıdaki uygulama senaryoları için uygundur:

  • Günlükçüler: Tüm sistemin yalnızca bir günlükçüye sahip olmasını ve çift günlükleme olasılığını önlemeyi garanti eder.
  • Veritabanı Bağlantı Havuzu: Yüksek eşzamanlılık ortamlarında Singleton Pattern kullanmak, veritabanı bağlantılarının sık sık oluşturulmasını ve yok edilmesini önler.

4. Golang'da Singleton Pattern'ın Uygulanması

Golang'da Singleton Pattern'ı uygulamanın farklı yolları bulunmaktadır. Aşağıda iki yaygın uygulama yöntemi bulunmaktadır.

4.1. Tembel Başlatma ve Esnek Başlatma Kullanarak Uygulama

Tembel başlatma, örnek nesne ilk kullanıldığında oluşturulurken; esnek başlatma, program başladığında örnek nesneyi oluşturur.

// Tembel başlatma Singleton Pattern'ı uygulaması
package singleton

type Singleton struct {
}

var instance *Singleton

func GetInstance() *Singleton {
    if instance == nil {
        instance = &Singleton{}
    }
    return instance
}

// Esnek başlatma Singleton Pattern'ı uygulaması
package singleton

type Singleton struct {
}

var instance *Singleton = &Singleton{}

func GetInstance() *Singleton {
    return instance
}

4.2. Singleton Pattern'da İş Parçacığı Güvenlik Sorunları

Yukarıdaki tembel başlatma uygulama yöntemi, çoklu iş parçacığı ortamında sorunlara neden olabilir çünkü birden çok iş parçacığı aynı anda if instance == nil koşuluna girebilir, böylece birden çok örnek oluşturulabilir.

4.3. sync.Once Kullanarak İş Parçacığı Güvenli Singleton Pattern'ı Uygulama

sync.Once kullanarak yalnızca bir iş parçacığının başlatma kodunu yürütmesini sağlayarak iş parçacığı güvenli sorununu çözebilir.

// sync.Once kullanarak iş parçacığı güvenli Singleton Pattern'ı uygulama
package singleton

import (
    "sync"
)

type Singleton struct {
}

var instance *Singleton
var once sync.Once

func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{}
    })
    return instance
}

4.4. sync.Mutex Kullanarak İş Parçacığı Güvenli Tembel Başlatma Singleton Pattern'ı Uygulama

İş parçacığı güvenli tembel başlatma Singleton Pattern'ını uygulamanın başka bir yolu, sync.Mutex kullanarak kilitleyerek ve yalnızca bir iş parçacığının başlatma işlemini yürüterek sağlanabilir.

// sync.Mutex kullanarak iş parçacığı güvenli tembel başlatma Singleton Pattern'ı uygulama
package singleton

import (
    "sync"
)

type Singleton struct {
}

var instance *Singleton
var mu sync.Mutex

func GetInstance() *Singleton {
    if instance == nil {
        mu.Lock()
        defer mu.Unlock()
        if instance == nil {
            instance = &Singleton{}
        }
    }
    return instance
}