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
}