Примеры использования Паттерн 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 или статически. Вместо этого для конструирования объекта служит метод Instance, который гарантирует, что в программе будет существовать только один экземпляр данного класса.
Таким образом, класс Singleton инкапсулирует в себе методы и свойства данной сущности, может быть доступен из любого места программы благодаря методу Instance, а, кроме того, теперь мы можем управлять временем жизни этого объекта. Вот пример использования класса Singleton:
Программирование для Linux. Профессиональный подход
Компьютеры и Интернет:
программирование
рейтинг книги
Эммануэль
1. Эммануэль
Любовные романы:
эро литература
рейтинг книги
Пустоши
1. Медорфенов
Фантастика:
фэнтези
попаданцы
рейтинг книги
Последний Паладин. Том 11
11. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 30
30. История Телепата
Фантастика:
альтернативная история
аниме
фэнтези
рейтинг книги
Linux Mint и его Cinnamon. Очерки применителя
Компьютеры и Интернет:
ос и сети
рейтинг книги
Ксеноцид (др. перевод)
4. История Эндера
Фантастика:
научная фантастика
боевая фантастика
космическая фантастика
рейтинг книги
M&D
2. Реальные истории
Детективы:
криминальные детективы
рейтинг книги
Ледяная Королева (Трилогия)
99. В одном томе
Фантастика:
фэнтези
рейтинг книги
Газлайтер. Том 38
38. История Телепата
Фантастика:
городское фэнтези
аниме
попаданцы
рейтинг книги
Стеллар. Заклинатель
3. Стеллар
Фантастика:
боевая фантастика
рейтинг книги
Том 2. Рассказы 60-х годов
2. Собрание сочинений в шести томах
Проза:
советская классическая проза
рейтинг книги
Симфонии
Поэзия:
поэзия
рейтинг книги