|
||||
|
Применение шаблонов языка C++.Альтернативой приведенной выше реализации может служить реализация класса Singleton при помощи шаблонов языка С++. Преимущество такого подхода заключается в автоматической параметризации метода Instance(), что приводит к отсутствию необходимости переопределять его в классах потомках. По изложенным ранее причинам конструктор класса-потомка также должен быть объявлен защищенным, а деструктор виртуальным. Кроме того, базовый класс Singleton должен быть объявлен другом класса наследника, поскольку метод Instance() базового класса в этой модели создает объект производного класса. листинг 9template <class T> class Singleton { static T* _self; static int _refcount; protected: Singleton(){} virtual ~Singleton(){_self=NULL;} public: static T* Instance(); void FreeInst(); }; template <class T> T* Singleton<T>::_self = NULL; template <class T> int Singleton<T>::_refcount=0; template <class T> T* Singleton<T>::Instance() { if(!_self) _self=new T; _refcount++; return _self; } template <class T> void Singleton<T>::FreeInst() { if(--_refcount==0) delete this; } class Derived: public Singleton<Derived> { protected: Derived(){} friend class Singleton<Derived>; }; int main(int argc, char* argv[]) { Derived *p = Derived::Instance(); … … … p->FreeInst(); return 0; } Классы, объекты которых должны существовать в единственном экземпляре, просто наследуются от шаблонного класса Singleton. Такой подход, однако, не позволяет создать иерархию классов во главе с классом-интерфейсом, в которой некоторые из классов-наследников реализуют паттерн проектирования Singleton, а некоторые нет (См листинг 8). С другой стороны, применение параметризованного класса позволяет вынести код Singleton’а в отдельный файл и включать его в последствии в создаваемые приложения, обеспечивая тем самым повторное использование паттерна Singleton. |
|
||
Главная | В избранное | Наш E-MAIL | Прислать материал | Нашёл ошибку | Наверх |
||||
|