Dupa cum am vazut nimeni nu a indraznit sa scrie vreun articol pana acum asa ca m-am gandit eu sa sparg gheata ;)
Sper sa vi se para interesant. Articolul este despre patternul Singleton.
Singleton este un design pattern ce obligea utilizatorul sa creeze un singur obiect al unei clase. Sa zicem de exemplu ca avem un logger ce scrie intr-un fisier. Ar fi aberant sa avem 2 obiecte de tip logger.
Bun, deci cum se implementeaza?
In primul rand vom crea o clasa pe care o vom deriva asa cum o sa va arat mai incolo. Clasa trebuie sa aiba constructorul privat, o variabila template statica ce tine un pointer la clasa si o functie static ce returneaza obiectul (sau il creeaza daca nu a fost creat). Suna relativ simplu nu? Pai sa trecem la cod
template < class T >
// aceasta clasa va implementa singetonul cu ajutorul template-urilor
class CSingleton
{
public:
// Aceasta functie returneaza obiectul clasei sau il creeaza daca acesta nu este deja creat
static T * s_ptGetInstance()
{
if(ms_tInstance == NULL)
ms_tInstance = new T();
return ms_tInstance;
}
protected:
// acesta este costructorul privat care nu face altceva decat initializeaza variabila cu NULL. Este vital sa fie privat deoarece acest lucru impiedica utilizatorul clasei sa creeze mai multe instante.
CSingleton()
{
ms_tInstance = NULL;
}
private:
// si insfarsit definim obiectul cu care vom lucra efectiv. Daca nu stiti “static” ii spune compilatorului ca vrem o singura variabila ms_tInstance si numai una.
static T *ms_tInstance;
};
Bun cam asta ar fi cu clasa, dar acum sa trecem la implementare…
Sa zicem ca vrem sa creem o clasa logger:
// Trebuie mai intai ca logger sa mosteneasca singleton
class CLogger : public CSingleton < CLogger >
{
//…………..blablabla ce mai vreti sa puneti in clasa
public:
// Declaram loggeru friend cu CSingleton pentru a putea utiliza clasa singleton
friend class CSingleton < CLogger >;
protected:
// si constructorul loggerului trebuie sa fie protected pentru a functiona singletonul
CLogger() { /*initializari*/ };
};
// Aici initializam pointerul catre instanta (este definit inafara clasei)
CLogger* CSingleton < CLogger >::ms_tInstance = NULL;
Pai cam asta ar fi. Astept pareri, intrebari, critici blablabla pe mail, yahoo sau ce aveti chef.