Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Для решения этой проблемы Паттерн 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, впервые предложенной Скоттом Мэйерсом.
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 с.) |