Konuya Giriş:
Singleton tasarım kalıbı, belirli bir sınıfın yalnızca bir örneğinin oluşturulmasını sınırlamak için önerilmiştir, bu durum küresel yöneticilerin (örneğin, günlük kaydedicilerin, kaynak havuzlarının, yapılandırıcıların) uygulanmasında talep edilmiştir.
Problem:
Singleton'ı uygulamak basit görünebilir, ancak C++'da zorluklar ortaya çıkar: çoklu iş parçacığı güvenliği, yok etmenin doğruluğu, başlatma sırası.
Çözüm:
Singleton'ı uygulamanın en güvenli ve modern yolu, bir statik fonksiyon içinde statik yerel bir değişken kullanmaktır, bu da ilk çağrıda yapılandırmayı garanti eder, çoklu iş parçacığı güvenliği (C++11'den itibaren) sağlar ve doğru yok edilmesini garanti eder.
Kod örneği:
class Singleton { public: static Singleton& instance() { static Singleton s; return s; } void doSomething() {} private: Singleton() {} Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; };
Ana özellikler:
Sıralama veya kopyalama ile ikinci bir Singleton örneği yaratılabilir mi?
Evet. Sıralama/yeniden sıralama yöntemleri uygulanırsa veya clone() yöntemini manuel olarak uygularsanız, kopyalama yapıcı sınırlaması yoksa, ikinci bir örnek ortaya çıkabilir. Bunu önlemek için tüm kopyalama, kopyalama ve sıralama yollarını yasaklamak gereklidir.
C++98/03 standardında, yerel statik bir değişken aracılığıyla çoklu iş parçacığı ortamında Singleton düzgün uygulanır mı?
Hayır. C++11'den önce, yerel statik değişkenler başlatma sırasında çoklu iş parçacığı güvenliğini garanti etmemiştir. Bu, iki iş parçacığı aynı anda instance() fonksiyonuna girdiğinde birden fazla örneğin oluşturulmasına yol açabilir. C++11 ve sonrası – sorun standart düzeyinde çözüldü.
Statik yerel bir değişken aracılığıyla oluşturulan Singleton örneği ne zaman yok edilir?
Nesne, kurulum sırasının tersine (LIFO) programın sonlanması aşamasında yok edilir (exit). Ancak, yok edicinin, zaten yok edilmiş nesnelere erişmesi durumunda sorunlara yol açabilir.
Günlük kaydı sisteminde geliştirici, küresel bir işaretçi ve new kullanarak Singleton'ı uygular, kopyalamayı yasaklamayı unutur. Program çalışır, ancak çoklu iş parçacığı ortamında bazen farklı günlük kaydedici örnekleri oluşur, mesajlar kaybolur.
Artılar:
Eksiler:
Singleton, statik bir yerel değişken aracılığıyla statik bir fonksiyonda uygulanmıştır, kopyalama yasaklanmıştır. Çoklu iş parçacığı güvenliği sağlanmış, program ölçeklenebilir hale gelmiş, günlükler doğru bir şekilde ayrılmıştır.
Artılar: