Edycja: Z innego pytania podałem odpowiedź, która zawiera linki do wielu pytań / odpowiedzi na temat singletonów: Więcej informacji na temat singletonów tutaj:
Przeczytałem więc temat Singletons: dobry projekt czy kula?
A kłótnia wciąż trwa.
Widzę Singletony jako wzorzec projektowy (dobry i zły).
Problemem w Singleton nie jest wzorzec, ale użytkownicy (przepraszam wszystkich). Wszyscy i ich ojciec myślą, że mogą poprawnie wdrożyć jedną (a z wielu wywiadów, które przeprowadziłem, większość ludzi nie może). Ponieważ wszyscy myślą, że mogą wdrożyć prawidłowy Singleton, nadużywają Wzorca i używają go w sytuacjach, które nie są odpowiednie (zastępując zmienne globalne Singletonami!).
Głównymi pytaniami, na które należy odpowiedzieć, są:
- Kiedy należy stosować Singleton
- Jak poprawnie wdrożyć Singleton?
Mam nadzieję, że ten artykuł pozwoli nam zebrać razem w jednym miejscu (zamiast wyszukiwać w Google i przeszukiwać wiele witryn) wiarygodne źródło informacji o tym, kiedy (a potem jak) poprawnie używać Singletona. Odpowiednia byłaby również lista Anti-Usages i typowych złych implementacji wyjaśniająca, dlaczego nie działają i dla dobrych implementacji ich słabości.
Więc
ruszaj piłką: podniosę rękę i powiem, że tego właśnie używam, ale prawdopodobnie mam problemy.
Podoba mi się „Scott Myers” zajmujący się tym tematem w swoich książkach „Effective C ++”
Dobre sytuacje do korzystania z singletonów (nie wiele):
- Ramy rejestrowania
- Pula recyklingu nici
/*
* C++ Singleton
* Limitation: Single Threaded Design
* See: http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
* For problems associated with locking in multi threaded applications
*
* Limitation:
* If you use this Singleton (A) within a destructor of another Singleton (B)
* This Singleton (A) must be fully constructed before the constructor of (B)
* is called.
*/
class MySingleton
{
private:
// Private Constructor
MySingleton();
// Stop the compiler generating methods of copy the object
MySingleton(MySingleton const& copy); // Not Implemented
MySingleton& operator=(MySingleton const& copy); // Not Implemented
public:
static MySingleton& getInstance()
{
// The only instance
// Guaranteed to be lazy initialized
// Guaranteed that it will be destroyed correctly
static MySingleton instance;
return instance;
}
};
OK. Pozyskajmy krytykę i inne implementacje razem.
:-)