- •Лабораторная работа №4 Шаблоны проектирования
- •Теоретические сведения
- •Отношения между классами. На диаграммах классов языка uml
- •Суть паттерна
- •Решение
- •Адаптер объектов
- •Адаптер классов
- •Адаптер классов не нуждается во вложенном объекте, так как он может одновременно наследовать и часть существующего класса, и часть сервиса.
- •Фасад (Facade)
- •Концептуальный пример
- •Program.Cs:
- •Output.Txt: Результат выполнения
- •Изолирует клиентов от компонентов подсистемы Уменьшая тем самым число объектов, с которыми клиентам приходится иметь дело, упрощая работу с подсистемой.
- •Позволяет ослабить связанность между подсистемой и ее клиентами.
- •Фасад не исключает возможности приложениям напрямую обращаться к классам подсистемы, если это необходимо.
- •Заместитель (Proxy)
- •3. Локальный запуск сервиса (удалённый прокси). Когда настоящий сервисный объект находится на удалённом сервере.
- •Концептуальный пример
- •Декоратор (Decorator)
- •// Объект
- •} //Ptr2 выходит из области видимости, но объект не //освобождается, потому что есть ptr, который по-прежнему //ссылается на него } //ptr выходит из области видимости, и объект уничтожается
- •Пример на языке c#
- •Порождающие шаблоны Абстрактная фабрика (Abstract Factory)
- •1. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы.
- •3. Таким образом, еще раз - предоставляет интерфейс для создания семейств, связанных между собой, или зависимых объектов.
- •Клиент пользуется только интерфейсами, заданными в классах «Абстрактная фабрика» и «Абстрактный продукт».
- •Фабричный метод (Factory Method)
- •Void info() {
- •Void info() {
- •Void info() {
- •Int main()
- •Одиночка (Singleton) Суть паттерна
- •If(!p_instance)
- •Поведенческие шаблоны Стратегия (Strategy)
- •Стратегии построения пути.
- •Структура
- •Концептуальный пример
- •Program.Cs: Пример структуры паттерна
- •Output.Txt: Результат выполнения
- •Void useStrategy(void)
- •Void setStrategy(Strategy* o)
- •Int main(int /*argc*/, char* /*argv*/[])
- •Наблюдатель (Observer) Суть паттерна
- •Решение
- •Структура
- •Шаги реализации
- •Концептуальный пример
- •Program.Cs: Пример структуры паттерна
- •// Random.Next(…) - Метод, возвращает случайное целое число //в указанном диапазоне.
- •Output.Txt: Результат выполнения
- •Использование паттерна Observer
- •Команда (Command)
- •Структура
- •Output.Txt: Результат выполнения
- •Задания для лабораторной работы
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, впервые предложенной Скоттом Мэйерсом.
// simpleclass.h class SimpleClass { public: int get() const; void set (int val); static SimpleClass& instance(); private: SimpleClass(int val); SimpleClass(); int m_val; }; //simpleclass.cpp SimpleClass& SimpleClass::instance() { static SimpleClass instance; return instance; } |
/*class OnlyOne
{
public:
static const OnlyOne& Instance()
{ static OnlyOne theSingleInstance;
return theSingleInstance;
}
private:
OnlyOne(){}
OnlyOne(const OnlyOne& root);
OnlyOne& operator=(const OnlyOne&);
};*/
Ещё один пример реализации одиночки на C++ с возможностью наследования для создания интерфейса, каркасом которого послужит, собственно, одиночка.
class Singleton
{
protected:
static Singleton* _self;
Singleton() {}
virtual ~Singleton() {}
public:
static Singleton* Instance()
{
if(!_self)
{
_self = new Singleton();
}
return _self;
}
static bool DeleteInstance()
{
if(_self)
{
delete _self;
_self = 0;
return true;
}
return false;
}
};
Singleton* Singleton ::_self = 0;
=================================================================================
