Ostatnio omówiliśmy ten temat w mojej klasie EECS. Jeśli chcesz szczegółowo zapoznać się z notatkami z wykładu, odwiedź http://umich.edu/~eecs381/lecture/IdiomsDesPattsCreational.pdf
Są dwa sposoby, które znam, aby poprawnie utworzyć klasę Singleton.
Pierwszy sposób:
Zaimplementuj to w sposób podobny do tego w przykładzie. Jeśli chodzi o zniszczenie, „Singletony zwykle znoszą czas trwania programu; większość systemów operacyjnych odzyska pamięć i większość innych zasobów po zakończeniu programu, więc istnieje argument za tym, aby się tym nie martwić”.
Jednak dobrą praktyką jest sprzątanie po zakończeniu programu. Dlatego możesz to zrobić za pomocą pomocniczej statycznej klasy SingletonDestructor i zadeklarować to jako przyjaciela w swoim Singleton.
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 zostanie utworzony podczas uruchamiania programu, a „gdy program się zakończy, wszystkie globalne / statyczne obiekty zostaną zniszczone przez kod zamknięcia biblioteki wykonawczej (wstawiony przez linker), więc narzędzie_destroyer zostanie zniszczone; jego destruktor usunie Singleton, uruchamiając jego burzyciel."
Drugi sposób
Nazywa się to Meyers Singleton, stworzony przez C ++ Wizard Scott Meyers. Po prostu zdefiniuj get_instance () inaczej. Teraz możesz także pozbyć się zmiennej elementu wskaźnika.
// public member function
static Singleton& Singleton::get_instance()
{
static Singleton s;
return s;
}
Jest to miłe, ponieważ zwracana wartość jest referencyjna i można użyć .
składni zamiast ->
dostępu do zmiennych składowych.
„Kompilator automatycznie buduje kod, który po raz pierwszy tworzy„ s ”poprzez deklarację, a nie później, a następnie usuwa obiekt statyczny po zakończeniu programu.”
Zauważ również, że dzięki Meyers Singleton „możesz dostać się w bardzo trudną sytuację, jeśli obiekty polegają na sobie w momencie zakończenia - kiedy Singleton znika w stosunku do innych obiektów? Ale w przypadku prostych aplikacji działa to dobrze”.