Название и классификация паттерна
Одиночка - паттерн, порождающий объекты.
Назначение
Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
Мотивация
Для некоторых классов важно, чтобы существовал только один экземпляр.
Сам класс контролирует то, что у него есть только один экземпляр, может запретить создание дополнительных экземпляров, перехватывая запросы на создание новых объектов, и он же способен предоставить доступ к своему экземпляру. Это и есть назначение паттерна одиночка.
Применимость
Используйте паттерн одиночка, когда:
· должен быть ровно один экземпляр некоторого класса, легко доступный всем клиентам;
· единственный экземпляр должен расширяться путем порождения подклассов, и клиентам нужно иметь возможность работать с расширенным экземпляром без модификации своего кода.
Структура
Участники
· Singleton- одиночка:
- определяет операцию Instance (копия, экземпляр класса), которая позволяет клиентам получать доступ к единственному экземпляру.
- может нести ответственность за создание собственного уникального экземпляра.
Отношения
Клиенты получают доступ к экземпляру класса Singleton только через его операцию Instance.
Результаты
У паттерна одиночка есть определенные достоинства:
· контролируемый доступ к единственному экземпляру. Поскольку класс Singleton инкапсулирует свой единственный экземпляр, он полностью контролирует то, как и когда клиенты получают доступ к нему;
|
|
· уменьшение числа имен. Паттерн одиночка - шаг вперед по сравнению с глобальными переменными. Он позволяет избежать засорения пространства имен глобальными переменными, в которых хранятся уникальные экземпляры;
· допускает уточнение операций и представления. От класса Singleton можно порождать подклассы, а приложение легко сконфигурировать экземпляром расширенного класса. Можно конкретизировать приложение экземпляром того класса, который необходим во время выполнения;
· допускает переменное число экземпляров. Паттерн позволяет вам легко изменить свое решение и разрешить появление более одного экземпляра класса Singleton. Вы можете применять один и тот же подход для управления числом экземпляров, используемых в приложении. Изменить нужно будет лишь операцию, дающую доступ к экземпляру класса Singleton;
· большая гибкость, чем у операций класса. Еще один способ реализовать функциональность одиночки - использовать операции класса. Но оба этих приема препятствуют изменению дизайна, если потребуется разрешить наличие нескольких экземпляров класса. Кроме того, статические функции-члены в C++ не могут быть виртуальными, так что их нельзя полиморфно заместить в подклассах.
|
|
Реализация
При использовании паттерна одиночка надо рассмотреть следующие вопросы:
1. гарантирование единственного экземпляра. Чаще всего для этого прячут операцию, создающую экземпляры, за операцией класса, которая гарантирует создание не более одного экземпляра. Данная операция имеет доступ к переменной, где хранится уникальный экземпляр, и гарантирует инициализацию переменной этим экземпляром перед возвратом ее клиенту. При таком подходе можно не сомневаться, что одиночка будет создан и инициализирован перед первым использованием.
В C++ операция класса определяется с помощью статической функции-члена Instance класса Singleton. В этом классе есть также статическая переменная-член _instance, которая содержит указатель на уникальный экземпляр.
Класс Singleton объявлен следующим образом:
class Singleton {
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* _instance;
};
А реализация такова:
Singleton* Singleton::_instance = 0;
Singleton* Singleton::Instance () {
if (_instance == 0) {
_instance = new Singleton;
}
return _instance;
}
Клиенты осуществляют доступ к одиночке исключительно через функцию-член Instance.
2. порождение подклассов Singleton. Основной вопрос не столько в том, как определить подкласс, а в том, как сделать, чтобы клиенты могли использовать его единственный экземпляр. По существу, переменная, ссылающаяся на экземпляр одиночки, должна инициализироваться вместе с экземпляром подкласса. Простейший способ добиться этого - определить одиночку, которого нужно применять в операции Instance класса Singleton.
|
|
Дата добавления: 2018-06-01; просмотров: 213; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!