Для решения этой проблемы Паттерн Singleton возлагает контроль над созданием единственного объекта на сам класс. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Для решения этой проблемы Паттерн Singleton возлагает контроль над созданием единственного объекта на сам класс.



1) Доступ к этому объекту осуществляется через статическую функцию-член класса, которая возвращает указатель или ссылку на него. Этот объект будет создан только при первом обращении к методу, а все последующие вызовы просто возвращают его адрес.

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

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

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

3) «Одиночка» определяет операцию Instance, которая позволяет клиентам получать доступ к единственному экземпляру.

Клиенты имеют доступ к «одиночке» только через эту операцию.

Паттерн позволяет избежать засорения пространства имен глобальными переменными, в которых хранятся уникальные экземпляры.

4) Реализуется одиночка обычно с помощью статического метода класса, который имеет доступ к переменной, хранящей уникальный экземпляр, и гарантирует инициализацию переменной этим экземпляром перед возвратом ее клиенту.

 

Наиболее часто встречающуюся реализацию паттерна Singleton.

 

// Singleton.h

Class Singleton

{

private:

static Singleton * p_instance;

// другие данные

// Конструкторы и оператор присваивания недоступныклиентам

Singleton() {}

Singleton(const Singleton&);

Singleton& operator=(Singleton&);

 

 public:

static Singleton * getInstance() {

   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&);

};

 

Классическая реализация паттерна Singleton может быть улучшена.

 

// Singleton.h



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 52; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.69.143 (0.005 с.)