"Примеры использования Паттерн Singleton (Одиночка)" - читать интересную книгу автора (Федоров Дмитрий)

Применение шаблонов языка C++.

Альтернативой приведенной выше реализации может служить реализация класса Singleton при помощи шаблонов языка С++. Преимущество такого подхода заключается в автоматической параметризации метода Instance(), что приводит к отсутствию необходимости переопределять его в классах потомках. По изложенным ранее причинам конструктор класса-потомка также должен быть объявлен защищенным, а деструктор виртуальным. Кроме того, базовый класс Singleton должен быть объявлен другом класса наследника, поскольку метод Instance() базового класса в этой модели создает объект производного класса.

листинг 9

template lt;class Tgt;

class Singleton {

 static T* _self;

 static int _refcount;

protected:

 Singleton(){}

 virtual ~Singleton(){_self=NULL;}

public:

 static T* Instance();

 void FreeInst();

};


template lt;class Tgt;

T* Singletonlt;Tgt;::_self = NULL;


template lt;class Tgt;

int Singletonlt;Tgt;::_refcount=0;


template lt;class Tgt;

T* Singletonlt;Tgt;::Instance() {

 if(!_self) _self=new T;

 _refcount++;

 return _self;

}


template lt;class Tgt;

void Singletonlt;Tgt;::FreeInst() {

 if(--_refcount==0) delete this;

}


class Derived: public Singletonlt;Derivedgt; {

protected:

 Derived(){}

 friend class Singletonlt;Derivedgt;;

};


int main(int argc, char* argv[]) {

 Derived *p = Derived::Instance();

 …

 …

 …

 p-gt;FreeInst();

 return 0;

}


Классы, объекты которых должны существовать в единственном экземпляре, просто наследуются от шаблонного класса Singleton. Такой подход, однако, не позволяет создать иерархию классов во главе с классом-интерфейсом, в которой некоторые из классов-наследников реализуют паттерн проектирования Singleton, а некоторые нет (См листинг 8). С другой стороны, применение параметризованного класса позволяет вынести код Singleton’а в отдельный файл и включать его в последствии в создаваемые приложения, обеспечивая тем самым повторное использование паттерна Singleton.