Примеры использования Паттерн Singleton (Одиночка)
Шрифт:
Проблемы, связанные с глобальными объектами
При разработке больших проектов, часто возникает необходимость обращаться из одного модуля программы к объектам, существующим в другом модуле. Такие объекты, как правило, существуют в единичных экземплярах, поэтому наиболее распространенной практикой является создание глобальных объектов данного типа и ссылка на них из других модулей программы с применением ключевого слова extern. Так, например, при создании ATL проекта в среде MSVC++, мастер проекта создает экземпляр класса – наследника от CComModule, _Module, в главном файле проекта, и помещает объявление extern CMyModule _Module в stdafx.h, что делает доступным объект _Module
Глядя на следующий фрагмент, нельзя сказать, была ли инициализирована инфраструктура, а если да, то ничего нельзя сказать о выбранной потоковой модели COM. Как следствие, такой код – источник ошибок и возможных проблем с их диагностикой.
При наличии в программе двух глобальных объектов, ссылающихся друг на друга, помещенных в разных модулях, может возникнуть ситуация, при которой один объект попытается обратиться к другому, еще не созданному объекту.
Выходом является использование паттерна проектирования Singleton. Его особенностью является то, что он гарантирует существование объекта в единственном экземпляре, а самое главное, то, что он создается в тот момент, когда это требуется клиенту. Последующие попытки конструирования объекта приводят лишь к возвращению клиенту ссылки на уже существующий объект, но не к созданию нового. Вот пример класса, реализующего логику паттерна Singleton:
class Singleton {
static Singleton* _self;
protected:
Singleton{}
public:
static Singleton* Instance {
if (!_self) _self = new Singleton;
return _self;
}
//методы
void aFunc1;
void aFunc2;
//данные
int aData;
ПРИМЕЧАНИЕ Конструктор класса объявлен в защищенной секции. Благодаря этому отсутствует возможность создавать объекты класса по оператору new или статически. Вместо этого
Таким образом, класс Singleton инкапсулирует в себе методы и свойства данной сущности, может быть доступен из любого места программы благодаря методу Instance, а, кроме того, теперь мы можем управлять временем жизни этого объекта. Вот пример использования класса Singleton:
Я все еще царь. Книга XXXI
31. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
рейтинг книги
Слово (Том 1)
рейтинг книги
Иди на Голгофу. Гомо советикус. Распутье. Русская трагедия
Документальная литература:
публицистика
рейтинг книги
Открытие Индии
Старинная литература:
прочая старинная литература
рейтинг книги
Я еще царь. Книга XXX
30. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
рейтинг книги
Моя прелестная роза
7. Падшие ангелы
Любовные романы:
исторические любовные романы
рейтинг книги
Draco Sinister
рейтинг книги
Иллюзион
Фантастика:
боевая фантастика
рейтинг книги
Адвокат империи
1. Адвокат Империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
рейтинг книги
В ожидании счастья
1. Исповедь королевы
Любовные романы:
исторические любовные романы
рейтинг книги