Чтение онлайн

на главную - закладки

Жанры

Примеры использования Паттерн Singleton (Одиночка)

Федоров Дима

Шрифт:
Листинг 8

class base {

protected:

 virtual ~base{}
 //гарантируем удаление только через FreeInst

public:

 virtual void Do1=0;

 virtual void FreeInst{delete this;}

};

class Simple: public base {

protected:

 ~Simple {printf("Simple::~Simple\n");}

public:

 void Do1{printf("Simple::Do1\n");}

};

class Singleton: public base {

 static Singleton* _self;

 static int _refcount;

protected:

 Singleton{}

 ~Singleton {printf("Singleton::~Singleton\n");}

public:

 static Singleton* Instance {

if(!_self) _self = new Singleton ;

_refcount++;

return _self;

 }

 void FreeInst {_refcount--; if(!_refcount) {delete this; _self=NULL;}}

void Do1{printf("Singleton::Do1\n");}

};

Singleton* Singleton::_self=NULL;

int Singleton:: _refcount=0;

class Client {

 base *objs[2];

 int ind;

public:

 Client{
objs[0]=NULL;objs[1]=NULL;ind=0; }

 ~Client {

for(int i=0;i<ind;i++) objs[i]->FreeInst;

 }

 void Add(base *p){if(ind<2) objs[ind++]=p;}

 void Do {

for(int i=0;i<ind;i++) objs[i]->Do1;

 }

};

void main {

 Client cl;

 cl.Add(Singleton::Instance);

 cl.Add(new Simple);

cl.Do;

}

результат работы программы:

Singleton::Do1 Simple::Do1 Singleton::~Singleton Simple::~Simple

В данном примере при разрушении объект класса Client автоматически вызываются методы FreeInst для каждого из хранимых указателей. Благодаря тому, что этот метод объявлен виртуальным, а в классах реализующих паттерн Singleton этот метод переопределен с учетом подсчета ссылок, то программа работает именно так как ожидается.

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

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

листинг 9

template <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.

Поделиться:
Популярные книги

Личный аптекарь императора. Том 4

Карелин Сергей Витальевич
4. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора. Том 4

Барон. Книга вторая

Первухин Андрей Евгеньевич
6. Ученик
Фантастика:
фэнтези
попаданцы
5.40
рейтинг книги
Барон. Книга вторая

Третий Генерал: Тома I-II

Зот Бакалавр
1. Третий Генерал
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Третий Генерал: Тома I-II

Главный рубильник. Расцвет и гибель информационных империй от радио до интернета

Ву Тим
Деловая литература:
о бизнесе популярно
5.00
рейтинг книги
Главный рубильник. Расцвет и гибель информационных империй от радио до интернета

Начало

Харенко Алина Александровна
1. Второй шанс
Фантастика:
фэнтези
5.00
рейтинг книги
Начало

Жизнь, которой не было

Денис Палимов
1. Жизнь, которой не было
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Жизнь, которой не было

Папина дочка

Рам Янка
4. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Папина дочка

Я – Легенда 2: геном хищника

Гарцевич Евгений Александрович
2. Я - Легенда!
Фантастика:
боевая фантастика
рпг
фантастика: прочее
попаданцы
5.00
рейтинг книги
Я – Легенда 2: геном хищника

Кодекс Охотника. Книга XXV

Винокуров Юрий
25. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга XXV

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

Второй кощей

Билик Дмитрий Александрович
8. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
5.00
рейтинг книги
Второй кощей

Пески веков (сборник)

Уиндем Джон Паркс Лукас Бейнон Харрис
1970. Зарубежная фантастика
Фантастика:
научная фантастика
5.00
рейтинг книги
Пески веков (сборник)

Возвращение

Кораблев Родион
5. Другая сторона
Фантастика:
боевая фантастика
6.23
рейтинг книги
Возвращение