Библиотека knigago >> Компьютеры: Языки и системы программирования >> Другие языки и системы программирования >> Примеры использования Паттерн Singleton (Одиночка)


СЛУЧАЙНЫЙ КОММЕНТАРИЙ

# 2118, книга: Бережок. Стихи и рассказы
автор: Виталий Титович Коржиков

От всей души рекомендую деткам и их родителям книжку «Бережок» автора Виталия Коржикова. Это сборник милых и добрых стихов и рассказов, которые прекрасно подходят для возраста от трёх до восьми лет. Стихи в книге мелодичные и лёгкие для запоминания, их можно читать перед сном или учить вместе с ребёнком. Мне особенно понравились «Кораблик» и «Берёзка», в них так здорово переданы образы природы. Рассказы в сборнике тоже замечательные. Они учат детей добру, дружбе и любви к природе. Особенно...

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

Примеры использования Паттерн Singleton (Одиночка)
Книга - Примеры использования Паттерн Singleton (Одиночка).  Дмитрий Федоров  - прочитать полностью в библиотеке КнигаГо
Название:
Примеры использования Паттерн Singleton (Одиночка)
Дмитрий Федоров

Жанр:

Другие языки и системы программирования

Изадано в серии:

неизвестно

Издательство:

неизвестно

Год издания:

-

ISBN:

неизвестно

Отзывы:

Комментировать

Рейтинг:

Поделись книгой с друзьями!

Помощь сайту: донат на оплату сервера

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

Аннотация к этой книге отсутствует.

Читаем онлайн "Примеры использования Паттерн Singleton (Одиночка)". [Страница - 3]

стр.
класс будет вызываться FreeInst() базового класса, не имеющего понятия о подсчете ссылок. Это приведет и к безусловному удалению объектов “Singleton” из памяти. Для предотвращения такого поведения следует объявить виртуальным метод FreeInst() в базовом классе и реализовать специфическое поведение метода для классов Singleton. Реализация FreeInst() в базовом классе предоставляет механизм удаления объектов, не являющихся 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.

Резюме

1. В классе Singleton конструктор должен быть объявлен в защищенной секции для предотвращения создания объекта способом, отличным от вызова метода Instance().

2. Деструктор также следует поместить в защищенную секцию класса, чтобы исключить возможность удаления объекта оператором delete.

3. Для автоматического подсчета ссылок при освобождении объекта следует применять специальный метод, такой как FreeInst().

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

5. Если предполагается полиморфная работа с классами, наследуемыми от одного базового класса, причем некоторые классы --">
стр.

Оставить комментарий:


Ваш e-mail является приватным и не будет опубликован в комментарии.

Книги схожие с «Примеры использования Паттерн Singleton (Одиночка)» по жанру, серии, автору или названию: