Bu konuyu yakın zamanda EECS sınıfımda ele aldık. Ders notlarına ayrıntılı bir şekilde bakmak isterseniz, http://umich.edu/~eecs381/lecture/IdiomsDesPattsCreational.pdf adresini ziyaret edin.
Tek bir Singleton sınıfı oluşturmanın doğru olduğunu bildiğim iki yol var.
İlk Yol:
Örneğinizde olduğu gibi uygulayın. İmhaya gelince, "Tekil programlar genellikle programın çalışma süresine dayanır; çoğu işletim sistemi, bir program sona erdiğinde belleği ve diğer birçok kaynağı kurtarır, bu nedenle bu konuda endişe etmemek için bir argüman vardır."
Ancak, program sona erdiğinde temizlemek iyi bir uygulamadır. Bu nedenle, bunu bir yardımcı statik SingletonDestructor sınıfıyla yapabilir ve bunu Singleton'unuzda bir arkadaş olarak ilan edebilirsiniz.
class Singleton {
public:
static Singleton* get_instance();
// disable copy/move -- this is a Singleton
Singleton(const Singleton&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(const Singleton&) = delete;
Singleton& operator=(Singleton&&) = delete;
friend class Singleton_destroyer;
private:
Singleton(); // no one else can create one
~Singleton(); // prevent accidental deletion
static Singleton* ptr;
};
// auxiliary static object for destroying the memory of Singleton
class Singleton_destroyer {
public:
~Singleton_destroyer { delete Singleton::ptr; }
};
Singleton_destroyer program başlangıcında oluşturulur ve "program sona erdiğinde, tüm global / statik nesneler çalışma zamanı kitaplığı kapatma kodu (linker tarafından eklenir) tarafından yok edilir, böylece the_destroyer imha edilir; yıkıcı Singleton'u siler, yoketme."
İkinci Yol
Buna C ++ sihirbazı Scott Meyers tarafından oluşturulan Meyers Singleton denir. Get_instance () yöntemini farklı bir şekilde tanımlamanız yeterlidir. Artık işaretçi üye değişkeninden de kurtulabilirsiniz.
// public member function
static Singleton& Singleton::get_instance()
{
static Singleton s;
return s;
}
Geri dönen değer referans olduğundan ve üye değişkenlere erişmek .
yerine sözdizimini kullanabildiğiniz için bu temizdir ->
.
"Derleyici, bildirimde bulunarak ilk kez 's' oluşturan kodu otomatik olarak oluşturur, daha sonra değil ve sonra program sonlandırıldığında statik nesneyi siler."
Ayrıca Meyers Singleton ile "nesneler sonlandırma sırasında birbirlerine güvenirlerse çok zor duruma girebileceğinize dikkat edin - Singleton diğer nesnelere göre ne zaman yok olur? Ama basit uygulamalar için bu iyi çalışır."