Patterns2015
.pdfПреимущества |
|
Избавляетпроектировщотнеобходвстримостика |
аиватькодзависящиеотприложения |
классы. |
|
Недостатки |
|
Возникаетдополнительныйуровеньподклассов. |
|
5.3 Абстрактнфабрика( я |
Abstract factory ) |
Фабрикасоздаобъ,сосеткизтнескольксоставныхоящиеыэлементовили |
|
обладающнесколькимиразличны |
свойствами. |
Клиентысоздаюткомплексныеобъектыиликомплексныесв йствабъектов,пользуясь |
|
исключительноинтерфейс м |
AbstractFactoryКлиеничегоне.известнотамклассах, |
реализующихобъектыконкретноготипа. |
|
Другимисловами,клиентыдолишьжны |
придерживатьсяинтерфейса,определенного |
абстрактным,неконкретнымклассом. |
|
Пример
Построитьгенераторсценариев,которыхесть |
: |
61
1.МестособытияШахта( ,Дремучийлес,Ферма)
2.ПостоянныйобитатШахтер( ,Ф) льрмер
3. Волшебникгерой/ Гном( ,Рыцарь,Гобл |
ин) |
|
Обычнаяреализация |
– наосновефабричныхметодов. |
|
Преимущества |
|
|
Абстрактнфабрикинкапсулируетответственнязасоздклиапроцессссовихсть |
|
|
создания,следователь,онаизоклиеотдеталейрунрео классовлизации.Простая |
|
|
заменаАбстрактно |
йфабрики,т..онаиспользуетсявприлтолькожедиразприн и |
|
инстанцировании. |
|
|
Недостатки |
|
|
ИнтерАбстрактнойфабрикиейсфикснаборобъектоврует,котм создатьрыежно. |
|
|
РасширенАбстрактнойфабрикидляизготеобъвыхвлчасезакнияторуднительв |
но. |
5Прототип.3 ( |
Prototype) |
|
Задаетвидысоздаваеобъектпомоэкземпляраыхщьюв |
-прототипасоздаетновые |
|
объектыпутемкопированияэтогопрототипа |
. |
Прототип – пример(1)
class Animal { protected:
int age; char * nameFood; public:
Animal() {age = 0; nameFood = new char[20;}
62
Animal(int n) {age = n; nameFood = new char[20];} Animal(const Animal* animal) {
this->age = animal -> age; memcpy(this->nameFood, animal->nameFood,strlen(animal->nameFood)+1);
}
virtual void feed() { cout << "Animal age " << age << " likes to eat " << nameFood << endl;
}
virtual Animal *clone() = 0;
};
Прототип – пример(2)
class Cat : public Animal // кошачьи
{
public:
Cat() {memcpy(this->nameFood,"meat",5);}
Cat(int n):Animal(n) {memcpy(this->nameFood,"meat",5); cout<<"Cat\n";} Animal *clone()
{
return new Cat(*this);
}
};
Прототип – пример(3)
class Tiger : public Cat // тигр
{
public:
Tiger() {cout<<"Tiger\n";}
Tiger(int n):Cat(n) {cout<<"Tiger\n";} void growl()
{
cout << "Tiger growls" << endl;
}
Animal *clone()
{
return new Tiger(*this);
}
};
Прототип – пример(4)
int main(int argc, char *argv[]) {
Tiger *tigerPrototype = new Tiger(); Animal *tiger2 = tigerPrototype->clone(); tigerPrototype ->feed();
tiger2->feed();
Animal * newAnimal = new Tiger(2);
63
Animal * animal2 = tigerPrototype->clone(); newAnimal->feed();
animal2->feed();
Animal * horse = new Horse(); Animal * animal3 = horse->clone(); horse->feed();
animal3->feed(); return 0;
}
Результатработы
5Строитель.4 ( Builder)
Проблема
Необхцеликос нодиздатьмо выйобъектспомсвоихщьюперацийдлядобавления конструктивныхэлемен.Можноизменяипыовчасформейьобъектаилируемого изменятьспособегостроения.
Результат
Отделиликонструирсл жнбъектаотегопредсваниего,такчрезультатавленияо |
е |
64
однтогои жепроцеконсмогуттруированиясаполучатьразныепред. ставления
Диаграммапоследовательности
Примерреализации
Создаемавтппроизводствуматгамбургеров Конструктор класса
Director ::Director (Builder *b){myBuilder = b;}
Производство
void Director::construct(){ b-> addSalad();
b -> addCheese(); b -> addMeat();
}
Недостатки
Builderдляклассаисоздаваимпродуктжесвязанымыйсткомеждусобой,поэтомупри
внесенииизмененийкласспродуктаскореевсегопридесоотся ветствующимобразом изменятьклассBuilder.
СтроительФабрика
•Фабрикаисподсозданильзуетсяэкзем,типкоторогозависитлярапередаваемых параметров.
• Строительиспользуется,к |
огдатизвестенп,надолишьпо |
-разаполнятьномуполя |
объекта. |
|
|
65
Итог:фабсоздаетразличныеикатипы,длястроителяисп динльзуетсятотжетип,но сразнымнаполнением .
5.5 Одиночка( |
Singleton) |
|
Проблема |
|
|
Необходимо,чтобыуклассасуществовалодинльэкземпляр,которомунужно |
|
|
создатьглобальнточкудоступаю |
|
. |
Результат |
|
|
Самклассконт,чторолируетн стьголько |
одинэкземпляр,можетзапретить |
|
созданиедополнительэкземпляр,перехвзапросынаыхтываязданиеобъектоввых, |
|
|
ионжеспособенпредок воемутэкземпляруупавить. |
|
66
Примеры проблем |
|
Впрограмможетбытьдовольномногосущне,к торыебязателстейдолжныбытьно |
|
всегоодномэкзем,нап:должнаримляребытьлишьоднарфайловаясистема,лишьодин |
|
файловыйменедж,лишьодносоекдинебазердан, динствыхиесистведенаяма |
ия |
системногожурналасообщений |
. |
Реализация |
|
Singleton * Singleton::instance = NULL; Singleton* Singleton::Instance (int data) {
if (instance == 0) { cout<<"new object \n"; instance = new Singleton(data);
} else cout<<"object already exists!\n"; return instance;
}
Singleton* Singleton::Instance () {
if (instance == 0) { cout<<"new object \n"; instance = new Singleton();
} else cout<<"object already exists!\n"; return instance;
}
Работа с объектом
int main(int argc, char *argv[]) {
Singleton * s = Singleton::Instance (123); Singleton * d = Singleton::Instance (456); s->run();
d ->run(); return 0;
}
Резульработыат
Отличияотстатичеклассакого
67
• |
У статичекласможетбысмнкогоатоьдчекго,вступаSinglet |
on – одна; |
• |
объект-одиночкуможнопередпар,статичеметромькласский |
– нельзя; |
•вслучаеSingletonестьвозмконтролироватьжнвремяжизнистьобъекта,случае
состатичеклассомким |
– нет; |
|
|
• объект-одиночкуможносериализировать,статичеклас кий |
– нельзя. |
||
5Пул.6объектов( |
Object Pool) |
|
Проблема
Созданиеобъектатребуетбольшзатратилможетибытьхсозданотолькоограниченное количествообънекклассаотороготов.
Решение |
|
|
Желательно,чтобывсемногократноисп бъектыльзуемые,свободныенекот |
орый |
|
момвр,ехрантмеводномнитомлисьжепулеобъект.Тогдаимоиупржвнаовлять |
|
|
основеединойполи.ДляэтклассогоикиObjectпроектируетсяпомощьюPoolпаттерна |
|
|
Singleton. Еслиунасмногооднотипныхобъектов,созданиеуничтожениекоторых |
|
|
занимаетмногоресур,удобноспользоватьэтотпа. терн |
|
|
Пулыобъектовизвестны( такжекакпулыр )сурсовисподуправленияьзуются |
|
|
кэшированиемобъектов.Клиент,имеющийдоступпулуобъектов,можетизбежать |
|
|
созданияобъектоввых,простозапрашив |
|
аявпусозданныйжелеэкземпляр.Пулобъектов |
можетбытьрастущим,когдаприотсутсвоботвииозндобъныхаютсявыеилиcкты |
|
|
ограничениемколичествасоздаваемыхобъектов.Уничтожобъектазамнангояетсяие |
|
|
возврпулддаятльнейшегоиспользовани |
|
я. |
Важныймомент: |
Объеквпуле,кобудуторыеиспользоватьсямног,должныкратно |
|
иметдлявьодзвратасвоёначальноесостоян,чтобыприповторномиеспользовании |
|
|
обънебылотакихктад ,которыенныхосталисьсозначениямиотпрошлогоиспользован |
ия. |
Реализация: наосновестекаилиочередивзавиотстратегииимостивыборкобъекта изпулаивозеговпулрата
68
5.7 Заданиякразделу5 |
|
|
|
|
ПаттерныФабрика,Абстрактнфабрик,Фабричныйметод,Прототипя |
: |
|
1. |
Рассмпроблпот объектовождениямуть |
системе.Предложитьреализациюна |
|
|
основефабрметодаили/ чногоабстрактнойфабрики |
. |
|
2. |
Ввестидляодногоизклассовзможностьклонированияобъектов |
|
|
3. |
Построитьдиаграммуклассов |
|
|
4. |
Представитьва расширнтылизациисистемыния |
|
|
|
ПатCтерроитель, Cнглтоы |
|
н,Пул : |
1. |
РассмпроблсоздатрнаосемутьпаттернаовеияСтроитель. |
|
|
2. |
Реализовмножествхраобътьнениенаосновеннктпулаобъектов. |
Пулможно |
|
|
реализкакодиночныйватьбъект. |
|
|
3. |
Выполнитьсравнитеанализреапорожденияизацииьный |
объектов |
|
4. |
Построитьдиа |
граммуклассов |
|
5. |
Представитьва расширнтылизациисистемыния |
|
69
6 Поведенческиешаблоны |
|
|
|
Паттерныповеденияопределяютспособывзаимеждубъекдейсвовремятамивия |
|
||
выпрограммыолнения. |
|
|
|
Какправипаттернов,реализацияповеденияос двухована |
ринципах: |
||
1. |
Компклассови зициябъектов |
|
|
2. |
Инкапосуляциявобъектеедения |
иделемугированиезапросов |
|
Списокшаблонов |
: |
|
|
1. |
State |
|
Состояние |
2. |
Observer |
|
Наблюдатель |
3. |
Memento |
|
Хранитель |
4. |
Command |
|
Команда |
5. |
Visitor |
|
Посетитель |
6. |
Strategy |
|
Стратегия |
7. |
Chain of Responsibility |
Цепочкаобязанностей |
|
8. |
Mediator |
|
Посредник |
9. |
Indirection |
|
Перенаправление |
10. |
Pure Fabrication |
Искусственный |
|
11. |
SnapShot |
|
Моментальныйснимок |
12. |
Фильтр |
|
Filter |
13. |
Read-Only Interface |
Толькодлячтения |
|
14. |
Interpreter |
|
Интерпретатор |
15. |
Controller |
|
Контроллер |
16. |
Null Object |
|
Нулевойобъект |
17. |
Template Method |
Шаблонныйметод |
70