On a more general note, Chapter 6 of Andrei Alexandrescu's book, "Modern C++ Design" has a detailed treatment of Singletons.
Neil >>> Jesús Alonso <[EMAIL PROTECTED]> 03/31/06 2:15 PM >>> Hi Well, I don't actually see the point of it. I might be wrong, but a protected or private inner class can't be accessed from outside, so you can't instance it under demand, and thus you can't destroy the singleton instances. In any case, writing a whole class for this purpose looks a bit overkill to me. In my opinion, as singleton instancing is a responsibility of the singleton implementors (using the GoF approach), the instence destroying should be so. Best regards, Jesús Alonso Abad > >Hello, > > > >I am reading "Pattern Hatching" by John Vlissides >(http://www.research.ibm.com/designpatterns/pubs/ph-jun96.txt). And I >have come across the Singleton Pattern. The way to use a >SingletonDestroyer (SD) class to "KILL a Singleton instance" has >fascinated me. > > > >I am a novice in this field as compared to most of the members and based >on my limited knowledge I have tried to come up with a slightly >different approach of destructing a singleton. So you are more then >welcome to send your comments on flaws in my approach. > > > >In John's approach, destructor is made protected so that the user is not >allowed to delete the singleton instance explicitly, also as said >Singleton class has the responsibility to construct and destruct its >instance. For this reason a separate class SD is introduced, which is a >friend of class Singleton. Class Singleton also has a static member of >SD. So as the SD's instance goes out of scope, it deletes the pointer of >Singleton assigned to it. SD has public constructor and a setter >function to set the Singleton pointer. > > > > class SingletonDestroyer { > public: > SingletonDestroyer(Singleton* s= 0) { _singleton = s; } > ~SingletonDestroyer() { delete _singleton; } > > void SetSingleton(Singleton* s) { _singleton = s; } > private: > Singleton* _singleton; > }; > > class Singleton { > public: > static Singleton* Instance(); > protected: > Singleton() { } > > friend class SingletonDestroyer; > virtual ~Singleton() { } > private: > static Singleton* _instance; > static SingletonDestroyer _destroyer; > }; > > > >Having a public SD constructor give a chance to user to create the SD >object explicitly, such as: > > > >Singleton *pSingleton = Singleton::Instance(); > >SingetonDestroyer explicitSingletonDestroyer(pSingleton); > > > >So the basic purpose of making the destructor of Singleton protected is >defeated. > > > >I have made a minor change in John's approach to rectify this problem. >Class SD is made the protected inner class of class MySingleton. This >prevents the user from creating an instance of SD class explicitly and >thus restricting the user to delete the Singleton pointer knowingly or >unknowingly. > > > >class CMySingleton > >{ > >protected: > > class SingletonDestroyer // Inner Class > > { > > public: > > SingletonDestroyer () {} > > ~SingletonDestroyer () { > > delete _pInstance; // deleting the singleton >instance > > } > > private: > > // Prevent users from making copies of a > > // Destroyer to avoid double deletion: > > SingletonDestroyer(const SingletonDestroyer&); > > void operator=(const SingletonDestroyer&); > > }; > > > > friend class SingletonDestroyer; > >protected: > > CMySingleton(); > > virtual ~CMySingleton(); > >public: > > static CMySingleton* GetInstance (); > > void DoSomething(); > >protected: //members > > static CMySingleton *_pInstance; > > static SingletonDestroyer _destroyer; > > int _nSomeVal; > >}; > > > >It still doesn't help you if you need to delete your singleton *before* >the end of the program. :-) > > > >Thanks, > >Nitin Maheshwari > >CA, India > >_______________________________________________ >patterns-discussion mailing list >[email protected] >http://lists.cs.uiuc.edu/mailman/listinfo/patterns-discussion _______________________________________________ patterns-discussion mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/patterns-discussion _______________________________________________ patterns-discussion mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/patterns-discussion
