Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабы / Лабораторная_работа_по_паттернам_new_—_копия.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
1.18 Mб
Скачать

If(!p_instance)

p_instance = new Singleton ();

return p_instance;

}

//другие методы

};

// Singleton.cpp

#include "Singleton.h"

Singleton* Singleton::p_instance = 0;

- Конструктор объявлен приватным, то есть его можно вызвать только из методов класса, в том числе из статических до создания объектов класса.

- То есть, чтобы создать объект класса мы не создаем его экземпляр, а «запрашиваем» его.

- Вызывая статический метод Singleton::getInstance(), вы получите экземпляр, готовый к работе.

- Может оказаться, что к этому моменту уже есть экземпляр, и если его нет, то только в этом случае он создастся.

- То есть происходит запрос к самому классу.

- Кроме того, паттерн предоставляет глобальную точку доступа к экземпляру: обратившись с запросом к классу в любой точке программы, вы получаете ссылку на единственный экземпляр.

- Возможно отложенное создание экземпляра, что особенно важно для объектов, создание которых сопряжено с большими затратами ресурсов.

Клиенты запрашивают единственный объект класса через статическую функцию-член getInstance(), которая при первом запросе динамически выделяет память под этот объект и затем возвращает указатель на этот участок памяти.

Впоследствии клиенты должны сами позаботиться об освобождении памяти при помощи оператора delete.

Последняя особенность является серьезным недостатком классической реализации шаблона Singleton. Так как класс сам контролирует создание единственного объекта, было бы логичным возложить на него ответственность и за разрушение объекта.

Этот недостаток отсутствует в реализации Singleton, впервые предложенной Скоттом Мэйерсом.

// simpleclass.h

class SimpleClass {

public:

  int get() const;

  void set (int val);

   static SimpleClass& instance();

private:

  SimpleClass(int val);

  SimpleClass();

   int m_val;

};

 //simpleclass.cpp

SimpleClass& SimpleClass::instance() {

  static SimpleClass instance;

  return instance;

}

/*class OnlyOne

{

public:

static const OnlyOne& Instance()

{ static OnlyOne theSingleInstance;

return theSingleInstance;

}

private:

OnlyOne(){}

OnlyOne(const OnlyOne& root);

OnlyOne& operator=(const OnlyOne&);

};*/

Ещё один пример реализации одиночки на C++ с возможностью наследования для создания интерфейса, каркасом которого послужит, собственно, одиночка.

class Singleton

{

protected:

static Singleton* _self;

Singleton() {}

virtual ~Singleton() {}

public:

static Singleton* Instance()

{

if(!_self)

{

_self = new Singleton();

}

return _self;

}

static bool DeleteInstance()

{

if(_self)

{

delete _self;

_self = 0;

return true;

}

return false;

}

};

Singleton* Singleton ::_self = 0;

=================================================================================