Завершающим этапом создания API будет создание класса Manager. Так как API содержит в себе множество методов и переменных, но часть функционала необходимо закрыть от постороннего вмешательства, чтобы не допустить нарушения целостности выполнения приложения. Решить такую задачу можно при помощи готового подхода, называемым шаблоном проектирования Façade. Основная идея, которого заключается в сведении всего функционала в один объект, тем самым гарантируя единую точку доступа для всех компонентов подсистем. В разрабатываемом API, класс Manager является реализацией такого шаблона, инкапсулируя в себя все предыдущие классы.
Класс Manager обеспечивает более высокий уровень взаимодействия с функционалом API и позволяет выполнять операции подобные перемещению квадрата в плоскости и созданию новых фигур определённо типа.
Чтобы закрыть доступ к основному хранилищу объектов создадим экземпляр класса MemoryDAO в классе Manager и сделаем его типа private.
private:
MemoryDAO dao;
Это позволит при наличии одного фасада гарантировать только одно хранилище объектов в API.
Единство точки доступа обеспечивается наличием только одного объекта Manager. Для этого воспользуемся шаблоном Singleton,который формирует структуру кода способную гарантировать, что у класса только один экземпляр, и предоставлена глобальная точка доступа.
Как гарантировать, что у класса есть единственный экземпляр и что он легко доступен?
1. Использовать глобальные переменные. Но это не запрещает создание объектов в другом месте.
2. Сам класс контролирует то, что у него есть только один экземпляр.
Реализуем эти параметры в классе Manager. Для этого сделаем закрытый статический указатель на объект класса Manager. Также закроем доступ, к конструктору сделав его типа protected, тем самым ограничив его зону видимости до локальной и запретив явный вызов конструктора из вне. Добавим открытый статический метод getManager() который проверяет, инициализирована ли переменная manager если нет создаёт объект Manager и присваивает его переменной, если да то возвращает уже созданный объект.
private:
static Manager* manager;
protected:
Manager(void);
public:
static Manager* getManager();
Manager* Manager::manager = 0;
Manager* Manager::getManager()
{
if(manager == 0)
{
manager = new Manager();
}
return manager;
}
Список литературы
1. С++: руководство для начинающих, 2-е издание.: Пер. с англ. – М.: Издательский дом «Вильямс», 2005.-672 с.: ил.- Парал. тит. англ.