Kami membahas topik ini baru-baru ini di kelas EECS saya. Jika Anda ingin melihat catatan kuliah secara detail, kunjungi http://umich.edu/~eecs381/lecture/IdiomsDesPattsCreational.pdf
Ada dua cara yang saya tahu untuk membuat kelas Singleton dengan benar.
Cara pertama:
Terapkan itu mirip dengan cara Anda memilikinya dalam contoh Anda. Sedangkan untuk penghancuran, "Lajang biasanya bertahan lama selama program dijalankan; sebagian besar OS akan memulihkan memori dan sebagian besar sumber daya lainnya ketika sebuah program berakhir, sehingga ada argumen untuk tidak khawatir tentang hal ini."
Namun, adalah praktik yang baik untuk membersihkan pada penghentian program. Oleh karena itu, Anda dapat melakukan ini dengan kelas SingletonDestructor statis tambahan dan menyatakannya sebagai teman di Singleton Anda.
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 akan dibuat pada startup program, dan "ketika program berakhir, semua objek global / statis dihancurkan oleh kode shutdown perpustakaan runtime (dimasukkan oleh linker), sehingga the_destroyer akan dihancurkan; destructor-nya akan menghapus Singleton, menjalankan destruktor. "
Jalan Kedua
Ini disebut Singleton Meyers, dibuat oleh penyihir C ++ Scott Meyers. Cukup tentukan get_instance () secara berbeda. Sekarang Anda juga dapat menyingkirkan variabel anggota penunjuk.
// public member function
static Singleton& Singleton::get_instance()
{
static Singleton s;
return s;
}
Ini rapi karena nilai yang dikembalikan adalah dengan referensi dan Anda dapat menggunakan .
sintaks alih-alih ->
mengakses variabel anggota.
"Kompiler secara otomatis membuat kode yang menciptakan 's' pertama kali melalui deklarasi, tidak setelahnya, dan kemudian menghapus objek statis pada penghentian program."
Perhatikan juga bahwa dengan Meyers Singleton Anda "dapat masuk ke situasi yang sangat sulit jika objek saling bergantung pada saat penghentian - kapan Singleton menghilang relatif terhadap objek lain? Tetapi untuk aplikasi sederhana, ini berfungsi dengan baik."