Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Singleton (Одиночка)

Содержание

Назначение паттерна «Одиночка»Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступаПриложению может потребоваться одна-единственная фабрика компонентов пользовательского интерфейсаПриложению может потребоваться одна-единственная база данных
Singleton (Одиночка) Назначение паттерна «Одиночка»Гарантирует, что у класса есть только один экземпляр, и предоставляет ПрименимостьДолжен быть ровно один экземпляр некоторого класса, легко доступный всем клиентамЕдинственный экземпляр СтруктураSingletonstatic Instance()SingletonOperation()GetSingletonData()Определяет операцию Instance() (статический метод в C++), которая позволяет клиентам получать ОтношенияКлиенты получают доступ к экземпляру класса Singleton только через его операцию Instance ДостоинстваКонтролируемый доступ к единственному экземпляруУменьшение числа имен по сравнению с глобальными переменнымиДопускает Простейшая реализацияtemplate class CSingleton : public boost::non_copyable{public:	static T& Instance()	{		// у класса T Thread-safe реализация паттерна «Одиночка»#include #include #include // Warning: If T's constructor throws, Пример использования#include #include #include // Warning: If T's constructor throws, instance() will Особенности реализации паттерна «Одиночка» в C++В C++ не определяется порядок вызова конструкторов Структурные паттерны Структурные паттерныОпределяют различные сложные структуры, изменяющие интерфейс существующих объектов или его реализациюАдаптер Адаптер (Adapter) Паттерн AdapterПреобразует интерфейс одного класса в интерфейс другого, который ожидают клиентыОбеспечивает совместную ПрименимостьНеобходимо использовать существующий класс, но его интерфейс не соответствует заданным требованиямСоздание повторно Структура адаптера классаClientTargetRequest()SpecificRequest()AdapteeSpecificRequest()(реализация)Определяет зависящий от предметной области интерфейс, которым пользуется ClientВзаимодействует с Структура адаптера объектовClientTargetRequest()adaptee->SpecificRequest()AdapteeSpecificRequest()adaptee Отношения (адаптер класса)Адаптер класса адаптирует Adaptee к Target, перепоручая действия конкретному классу Отношения (адаптер объектов)Позволяет одному адаптеру Adapter работать со многими адаптируемыми объектами AdapteeС Вопросы, которые необходимо иметь в видуОбъем работыЗависит от того, насколько сильно различаются Реализация адаптеров классовВ C++ Adapter должен открыто наследоваться от Target и закрыто Пример – иерархия графических объектовclass CPoint{public:	int x, int y};class CShape{public:	virtual void GetBoundingBox(CPoint Решениеclass CPoint{public:	…	int x, int y};class CShape	// целевой объект{public:	virtual void GetBoundingBox(CPoint & bottomLeft, Реализация сменных адаптеровЗадача – разработать компонент CTreeDisplay для визуализации древовидных структурИерархии классовДерево Реализация сменных адаптеровШаг 1. Поиск «узкого» интерфейса для AdapteeНаименьшее подмножество операций, позволяющее Подход 1 – «Использование абстрактных операций»Определим в классе CTreeDisplay абстрактные операции, соответствующие СтруктураCTreeDisplay (Client, Target)GetChildren(CNode)CreateGraphicNode(CNode)Display()BuildTree(Node n)DirectoryTreeDisplay (Adapter)GetChildren(Node)CreateGraphicNode(Node)CFileSystemEntity (Adaptee)GetChildren(n)Для каждого потомка {	AddGraphicNode(CreateGraphicNode(child))	BuildTree(child)} Подход 2 – «Использование объектов-уполномоченных»CTreeDisplay выполняет переадресацию запросов к иерархической структуре объекту-уполномоченномуУзкий СтруктураCTreeDisplay (Client)SetDelegate(CTreeAccessorDelegate)Display()BuildTree(Node n)delegate->GetChildren(this, n)Для каждого потомка {	AddGraphicNode(		delegate->CreateGraphicNode(this, child))	BuildTree(child)}CTreeAccessorDelegate (Target)GetChildren(CTreeDisplay, Node)CreateGraphicNode(CTreeDisplay, Node)CDirectoryBrowser (Adapter)GetChildren(CTreeDisplay, Node)CreateGraphicNode(CTreeDisplay, Node)CreateFile()DeleteFile()CFileSystemEntity (Adaptee)delegate
Слайды презентации

Слайд 2 Назначение паттерна «Одиночка»
Гарантирует, что у класса есть только

Назначение паттерна «Одиночка»Гарантирует, что у класса есть только один экземпляр, и

один экземпляр, и предоставляет к нему глобальную точку доступа
Приложению

может потребоваться одна-единственная фабрика компонентов пользовательского интерфейса
Приложению может потребоваться одна-единственная база данных

Слайд 3 Применимость
Должен быть ровно один экземпляр некоторого класса, легко

ПрименимостьДолжен быть ровно один экземпляр некоторого класса, легко доступный всем клиентамЕдинственный

доступный всем клиентам
Единственный экземпляр должен расширяться путем порождения подклассов,

и клиентам нужно иметь возможность работать с расширенным экземпляром без модификации своего кода

Слайд 4 Структура
Singleton
static Instance()
SingletonOperation()
GetSingletonData()
Определяет операцию Instance() (статический метод в C++),

СтруктураSingletonstatic Instance()SingletonOperation()GetSingletonData()Определяет операцию Instance() (статический метод в C++), которая позволяет клиентам

которая позволяет клиентам получать доступ к единственному экземпляру
Может нести

ответственность за создание собственного уникального экземпляра

static uniqueInstance
singletonData

return uniqueInstance


Слайд 5 Отношения
Клиенты получают доступ к экземпляру класса Singleton только

ОтношенияКлиенты получают доступ к экземпляру класса Singleton только через его операцию Instance

через его операцию Instance



Слайд 6 Достоинства
Контролируемый доступ к единственному экземпляру
Уменьшение числа имен по

ДостоинстваКонтролируемый доступ к единственному экземпляруУменьшение числа имен по сравнению с глобальными

сравнению с глобальными переменными
Допускает уточнение операций и представления
От класса

Singleton можно порождать подклассы
Допускает переменное число экземпляров
Необходимо лишь изменить операцию Instance
Большая гибкость, чем у статических функций класса
В C++ статические функции не могут быть виртуальными => нельзя использовать полиморфизм

Слайд 7 Простейшая реализация
template class CSingleton : public boost::non_copyable
{
public:
static

Простейшая реализацияtemplate class CSingleton : public boost::non_copyable{public:	static T& Instance()	{		// у класса

T& Instance()
{
// у класса T есть конструктор по умолчанию
static

T theSingleInstance;
return theSingleInstance;
}
};

class COnlyOne : public CSingleton
{
friend class CSingleton
COnlyOne(){} // закрытый конструктор по умолчанию
//.. интерфейс класса
};

int main()
{
COnlyOne & one = COnlyOne::Instance();
// использование экземпляра one
}

Слайд 8 Thread-safe реализация паттерна «Одиночка»
#include
#include
#include

// Warning:

Thread-safe реализация паттерна «Одиночка»#include #include #include // Warning: If T's constructor

If T's constructor throws, instance() will return a null

reference.
template class CSingleton : private boost::noncopyable
{
public:
static T& instance()
{
boost::call_once(init, flag);
return *t;
}
static void init() // never throws
{
t.reset(new T());
}
protected:
~CSingleton() {}
CSingleton() {}
private:
static boost::scoped_ptr t;
static boost::once_flag flag;
};
template boost::scoped_ptr CSingleton::t(0);
template boost::once_flag CSingleton::flag = BOOST_ONCE_INIT;

Слайд 9 Пример использования
#include
#include
#include
// Warning: If T's

Пример использования#include #include #include // Warning: If T's constructor throws, instance()

constructor throws, instance() will return a null reference.
template

class Singleton : private boost::noncopyable
{
public:
static T& Instance()
{
boost::call_once(Init, flag);
return *t;
}
static void Init() // never throws
{
t.reset(new T());
}
protected:
~Singleton() {}
Singleton() {}
private:
static boost::scoped_ptr t;
static boost::once_flag flag;
};
template boost::scoped_ptr Singleton::t(0);
template boost::once_flag Singleton::flag = BOOST_ONCE_INIT;

class CMyClass : public CSingleton
{
friend class CSingleton;
public:
void DoSomething()
{
std::cout << "Something";
}
private:
CMyClass();
};
void test()
{
CMyClass::Instance().DoSomething();
}


Слайд 10 Особенности реализации паттерна «Одиночка» в C++
В C++ не

Особенности реализации паттерна «Одиночка» в C++В C++ не определяется порядок вызова

определяется порядок вызова конструкторов для глобальный объектов через границы

единиц трансляции
Между одиночками не может существовать никаких зависимостей

Слайд 11 Структурные паттерны

Структурные паттерны

Слайд 12 Структурные паттерны
Определяют различные сложные структуры, изменяющие интерфейс существующих

Структурные паттерныОпределяют различные сложные структуры, изменяющие интерфейс существующих объектов или его

объектов или его реализацию
Адаптер (Adapter)
Мост (Bridge)
Компоновщик (Composite)
Декоратор (Decorator)
Фасад (Facade)
Приспособленец

(Flyweight)
Заместитель (Proxy)

Слайд 13 Адаптер (Adapter)

Адаптер (Adapter)

Слайд 14 Паттерн Adapter
Преобразует интерфейс одного класса в интерфейс другого,

Паттерн AdapterПреобразует интерфейс одного класса в интерфейс другого, который ожидают клиентыОбеспечивает

который ожидают клиенты
Обеспечивает совместную работу классов с несовместимыми интерфейсами,

которая без него была бы невозможна
Альтернативное название – Wrapper (Обертка)
Типы:
Адаптер класса
Адаптер объекта

Слайд 15 Применимость
Необходимо использовать существующий класс, но его интерфейс не

ПрименимостьНеобходимо использовать существующий класс, но его интерфейс не соответствует заданным требованиямСоздание

соответствует заданным требованиям
Создание повторно используемого класса, который должен взаимодействовать

с заранее неизвестными или не связанными с ним классами, имеющими несовместимые интерфейсы
Использование нескольких существующих подклассов, приспосабливая интерфейс их общего родительского класса (только для адаптера объектов)

Слайд 16 Структура адаптера класса
Client
Target
Request()
SpecificRequest()
Adaptee
SpecificRequest()
(реализация)
Определяет зависящий от предметной области интерфейс,

Структура адаптера классаClientTargetRequest()SpecificRequest()AdapteeSpecificRequest()(реализация)Определяет зависящий от предметной области интерфейс, которым пользуется ClientВзаимодействует

которым пользуется Client
Взаимодействует с объектами, удовлетворяющими интерфейсу Target
Определяет существующий

интерфейс, который нуждается в адаптации

Адаптирует интерфейс Adaptee к интерфейсу Target


Слайд 17 Структура адаптера объектов
Client
Target
Request()
adaptee->SpecificRequest()
Adaptee
SpecificRequest()
adaptee

Структура адаптера объектовClientTargetRequest()adaptee->SpecificRequest()AdapteeSpecificRequest()adaptee

Слайд 18 Отношения (адаптер класса)
Адаптер класса адаптирует Adaptee к Target,

Отношения (адаптер класса)Адаптер класса адаптирует Adaptee к Target, перепоручая действия конкретному

перепоручая действия конкретному классу Adaptee
Этот паттерн не будет работать,

если мы захотим одновременно адаптировать класс и его подклассы
Позволяет адаптеру Adapter заместить некоторые операции адаптируемого класса Adaptee
Вводит только один новый объект
Для того, чтобы добраться до адаптируемого класса, не нужно дополнительного обращения по указателю

Слайд 19 Отношения (адаптер объектов)
Позволяет одному адаптеру Adapter работать со

Отношения (адаптер объектов)Позволяет одному адаптеру Adapter работать со многими адаптируемыми объектами

многими адаптируемыми объектами Adaptee
С самим Adaptee и его подклассами

при их наличии
Адаптер может добавить новую функциональность сразу всем адаптируемым объектам
Затрудняет замещение операций класса Adaptee
Для этого необходимо породить от Adaptee подкласс и заставить Adapter ссылаться на этот подкласса, а не на сам Adaptee

Слайд 20 Вопросы, которые необходимо иметь в виду
Объем работы
Зависит от

Вопросы, которые необходимо иметь в видуОбъем работыЗависит от того, насколько сильно

того, насколько сильно различаются интерфейсы целевого и адаптируемого классов
Сменные

адаптеры
Решается путем адаптации интерфейсов
Использование двусторонних адаптеров для обеспечения прозрачности
Полезны в тех случаях, когда необходимо клиенту необходимо видеть как адаптируемый, так и целевой объект

Слайд 21 Реализация адаптеров классов
В C++ Adapter должен открыто наследоваться

Реализация адаптеров классовВ C++ Adapter должен открыто наследоваться от Target и

от Target и закрыто – от Adaptee
Adapter – подтип

Target, но не Adaptee

class CTarget
{
public:
virtual void DoSomething() = 0;
};
class CAdaptee
{
public:
void DoSomethingGood();
};
class CAdapter : public CTarget, private CAdaptee
{
public:
virtual void DoSometing()
{
DoSomethingGood();
}
};


Слайд 22 Пример – иерархия графических объектов
class CPoint
{
public:
int x, int

Пример – иерархия графических объектовclass CPoint{public:	int x, int y};class CShape{public:	virtual void

y
};
class CShape
{
public:
virtual void GetBoundingBox(CPoint & bottomLeft, CPoint & topRight)const
};

class

CTextView
{
public:
int GetLeft()const;
int GetTop()const;
int GetWidth()const;
int GetHeight()const;
};

Задача – добавить в иерархию класс CTextShape (наследник CShape), используя функциональность класса CTextView


Слайд 23 Решение
class CPoint
{
public:

int x, int y
};
class CShape // целевой объект
{
public:
virtual

Решениеclass CPoint{public:	…	int x, int y};class CShape	// целевой объект{public:	virtual void GetBoundingBox(CPoint &

void GetBoundingBox(CPoint & bottomLeft, CPoint & topRight)const;
};

class CTextView {…}; //

адаптируемый класс

// адаптер
class CTextShape : public CShape, private CTextView
{
public:
virtual void GetBoundingBox(CPoint & bottomLeft, CPoint & topRight)const
{
bottomLeft.x = GetLeft();
bottomLeft.y = GetTop() + GetHeight();
topRight.x = GetLeft() + GetWidth();
topRight.y = GetTop();
}
};

Слайд 24 Реализация сменных адаптеров
Задача – разработать компонент CTreeDisplay для

Реализация сменных адаптеровЗадача – разработать компонент CTreeDisplay для визуализации древовидных структурИерархии

визуализации древовидных структур
Иерархии классов
Дерево папок
Иерархии живых организмов
Для разных типов

структур нужны разные операци доступа к потомкам:
GetSubclasses для классов, GetSubdirectories для файловой системы, и т.п.
Компонент CTreeDisplay должен уметь отображать иерархии обоих видов даже если у них разные интерфейсы

Слайд 25 Реализация сменных адаптеров
Шаг 1. Поиск «узкого» интерфейса для

Реализация сменных адаптеровШаг 1. Поиск «узкого» интерфейса для AdapteeНаименьшее подмножество операций,

Adaptee
Наименьшее подмножество операций, позволяющее выполнить адаптацию
Минимальный интерфейс для CTreeDisplay

может включать всего две операции
Получить графическое представление узла
Доступ к потомкам узла
Шаг 2. Выбор одного из следующих подходов к реализации
Использование абстрактных операций
Использование объектов-уполномоченных

Слайд 26 Подход 1 – «Использование абстрактных операций»
Определим в классе

Подход 1 – «Использование абстрактных операций»Определим в классе CTreeDisplay абстрактные операции,

CTreeDisplay абстрактные операции, соответствующие узкому интерфейсу класса Adaptee
Подклассы CTreeDisplay

реализовывают данные операции и адаптируют иерархически структурированный объект
Класс CDirectoryTreeDisplay будет осуществлять доступ к структуре каталогов файловой системы
Класс CDirectoryTreeDisplay специализирует узкий интерфейс таким образом, чтобы он мог отображать структуру каталогов, составленную из объектов CFileSystemEntity

Слайд 27 Структура
CTreeDisplay (Client, Target)
GetChildren(CNode)
CreateGraphicNode(CNode)
Display()
BuildTree(Node n)
DirectoryTreeDisplay (Adapter)
GetChildren(Node)
CreateGraphicNode(Node)
CFileSystemEntity (Adaptee)
GetChildren(n)
Для каждого потомка

СтруктураCTreeDisplay (Client, Target)GetChildren(CNode)CreateGraphicNode(CNode)Display()BuildTree(Node n)DirectoryTreeDisplay (Adapter)GetChildren(Node)CreateGraphicNode(Node)CFileSystemEntity (Adaptee)GetChildren(n)Для каждого потомка {	AddGraphicNode(CreateGraphicNode(child))	BuildTree(child)}

{
AddGraphicNode(CreateGraphicNode(child))
BuildTree(child)
}


Слайд 28 Подход 2 – «Использование объектов-уполномоченных»
CTreeDisplay выполняет переадресацию запросов

Подход 2 – «Использование объектов-уполномоченных»CTreeDisplay выполняет переадресацию запросов к иерархической структуре

к иерархической структуре объекту-уполномоченному
Узкий интерфейс объекта-уполномоченного (Целевой объект) помещается

в абстрактный класс CTreeAccessorDelegate
Класс CDirectoryBrowser (Адаптер) наследуется от CTreeAccessorDelegate, реализуя абстрактные операции уполномоченного объекта

  • Имя файла: singleton-odinochka.pptx
  • Количество просмотров: 87
  • Количество скачиваний: 0