Главная » Просмотр файлов » А. Александреску - Современное проектирование на C++

А. Александреску - Современное проектирование на C++ (1119444), страница 59

Файл №1119444 А. Александреску - Современное проектирование на C++ (А. Александреску - Современное проектирование на C++) 59 страницаА. Александреску - Современное проектирование на C++ (1119444) страница 592019-05-09СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 59)

Основной недостаток шаблона аЬзггаст яастогу заключается в том, что базовый класс фабрики (в нашем примере дЬзтгастяпееуяастогу) должен владеть информацией о каждом создаваемом абстрактном изделии. Кроме того, по крайней мере в только что описанной реализации, каждый конкретный фабричный класс зависит от конкретного изделия, которое он создает. С помошью приемов, описанных в главе 8, можно понизить степень этой зависимости. В той главе мы создавали конкретные объекты, не зная ничего об их типах.

Единственным доступным источником информации были идентификаторы типов (например, целые числа или строки). Однако, чем больше мы снижаем степень зависимости между классами, тем меньше становится объем информации о типах, следовательно, значительно снижается степень типовой безопасности приложения. Это еше один пример классической дилеммы, возникающей в языке С++: высокая степень типовой безопасности или слабая взаимосвязь между классами. Как это часто бывает, правильное решение можно найти с помошыо компромисса. В каждом конкретном приложении следует искать свою золотую середину.

Обшее правило таково: используйте статическую модель, если можете, и динамическую модель, если вынуждены. Обобщенная реализация шаблона аЬзтгаст Растогу, описанная в следуюших разделах, обладает интересным свойством, позволяюшим снизить степень статической зависимости между классами без снижения степени типовой безопасности. 9.2. Обобщенный интерфейс шаблона АЬа1гас1 РасФогу Как указывалось в главе 3, функциональные возможности класса туре1з зт позволяют реализовать обобщенный шаблон АЬзтгасс еастогу. В этом разделе показано, как определяется обобшенный интер:рейс дЬзтгастяастогу с помошью списков типов.

Пример, описанный в предыдушем разделе, представляет собой типичное применение шаблона проектирования дЬзтгаст яастогу. Его использование сводится к следующему. ° Определяется абстрактный класс (класс абстрактной фабрики), содержаший одну чисто виртуальную функцию для каждого типа изделий. Виртуальная функция, соответствующая типу т, обычно возврашает указатель типа т'.

Она называется Сгеатет, махет или как-то еше. ° Определяется одна или несколько конкретных фабрик, реализуюших интерфейс, определенный абстрактной фабрикой. Реализуется каждая из функций- членов, создаюших новый объект производного типа с помошью оператора пеп. Все это выглядит довольно просто, но при возрастании количества изделий, создаваемых абстрактной фабрикой, программа становится все более ненадежной.

Более того, в любой момент программист может внедрить в программу новую реализацию, которая использует другой механизм распределения памяти, или прототип объекта. 242 Часть П. Компоненты В этой ситуации на помошь приходит шаблон АЬзтгаст Растогу при условии, что он достаточно гибок и позволяет легко реализовать новый механизм распределения памяти и передачи аргументов конструктору. Напомним, что шаблонный класс бепбсаттегн(егагспу, описанный в главе 3, конкретизирует базовый шаблон, предоставленный пользователем, для каждого типа, приведенного в списке типов, По своей структуре полученная в результате конкрети- заиия класса бепзсаттегн1егагсиу наследует все конкретизаиии шаблона, предостав- ленного пользователем.

Иными словами, если есть шаблон ип(т и список типов тьтзт, то класс бепбсаттеГНзегагсйу<тьззт, аозт> является наследником класса опт т<т> для каждого типа т, укаэанного в списке тьэ зт. Класс аепвсаттегн(егагсиу может оказаться очень полезным для определения интерфейса абстрактной фабрики — программисту достаточно определить интерфейс, который способен создавать объекты определенного типа, а затем применить этот ин- терфейс к нескольким типам с помошью класса аепвсаттегн(егагсиу.

Интерфейс, способный создавать объекты обобщенного класса т, выглядит сле- дуюшим образом, тевр1ате <с1аав т> с1ааа АЬзтгастрастогуоп(т ( роЬ1з с: уэгтера! т* посгеате(туре2туре<т> 0); ч1гтиа1 -АЬзтгастрастогуипзтО () ): Этот небольшой шаблон выглядит вполне прилично — виртуальный конструктор и ничего больше', — но зачем здесь класс туре2туреу Как указывалось в главе 2, класс туре2туре — это простой шаблон, единственное прелназначение которого — обеспе- чить однозначный выбор перегруженных функиий. Ладно, но где тут перегруженные функиииу Ведь в классе Аьзтгастрастогуапзс определяется только одна функиия по- сгеате. Однако одной и той же иерархии классов могут принадлежать разные конкре- тизации класса АЬзтгастрастогуипзт.

Класс туре2туре<т> позволяет избежать неод- нозначности выбора разных вариантов перегруженной функпии посгеате. Обобшенный интерфейс АЬз т гас тра Сто гу ИсПОЛьзУет класс реп б«атее гН( е гаге пу в сочетании с классом АЬатгастрастогупп(т, тевр1ате < с1ааа тьэ'зт, теир1ате <с1азз» с1ааа пп(т АЬзтгастрасеогуппчт > с1азз АЬзтгастрастогу : риЬ11с аепбсаттегнзегагспу<тьззт, оп(т> ( риЬ)т с: туредет тьззт Ргодистьчзт; тевр1ате <с1ааа т> т" сгеатео ( 'опзт <т>б оп(т *сиза; гетогп ипчс.оосгеате(туре2туре<т>0); ' Виртуальные конструкторы подробно обсуждались в главе 4, 243 Глава 9. Шаблон АЬатгвсг гасгогу Вот тут-то на арене появляется класс Туре2туре, уточняюший, что функция оосгеасе вызывается функцией сгеате. проанализируем следуюшии фрагмент кода. О код приложения Суре<)еФ АЬзтгассрастогу « туРЕЬ15Т ЗСЗо1<)1ег, мопзтег, 5црегиопзтег) Овпвсаивнввгагспу <$ирагмопв1вг,АЬв(гас1рас1огуцпв> Овсвсаивги)вгагспу <Ниатурв,ааа(гвгдрасвгуцпп> Оапвсаввгигвгагспу <Мопыаг,АЬввас1расгогуопа> ОвпвсаиагН(агагсЬу <ТУРЕЫЗТ 1(ЗирвгМооа1вг),АЬааас(расгогуопв> ОвпасапвгН)вгагсЛТ <зоымпл)вьасграс1сгуцп)г> ОапвсапвгН)агагспу <ТУРЕЫЗТ 2(Мопвгвг, ЗирвФЬпв1вг),АЬаеас(Еас1огу0пи> АЬа1гас(ЕпввуЕасаяу Рис.

9.2 Иерархия клиссов, гсггериррсмая классом Абпгасгрисюгу 244 Часть Н, Компоненты > АЬзтгастепевуеастогу; В главе 3 было показано, что шаблонный класс АЬзтгастеастогу генерирует иерархию классов, показанную на рис. 9.2. Класс АЬзсгастепевурассогу является потомком классов АЬзсгастрастогуип(т«5о(г)(ег>, АЬзтгастеастогуцп1т«мопзтег> и АЬзсгастепевуцп(т«5црегвопзтег>. В каждом из них определяется чисто виртуальная функция-член Сгеате, так что класс АЬзтгастепевурастогу обладает тремя перегруженными функциями сгеасе.

Короче говоря, класс АЬзтгастепевурастогу практически эквивалентен абстрактному классу с тем же именем, определенному в предьшушем разделе. Шаблонная функция-член Сгеате из класса АЬзтгассеассогу играет роль диспетчера, направляющего запрос на создание объекта соответствующему базовому классу, АЬзтгастепевукастогу* р = ...; мопзтег» ройге = р->сгеате<мопзтег>О; Автоматически генерируемая версия класса обладает одним важным преимушеством — класс АЬзсгассепевукастогу имеет высокий уровень модульносюм (кгапц!атйу). Программист может автоматически конвертировать ссылку на объект класса АЬзсгаствпевугастогу В ССЫЛКУ на объект класса АЬзтгасскастогу<5о1с)зег>, АЬзтгастеасЕОГУ<МОПзтеГ> иЛи ДЬзтгасскастогу<5орегмопзтег>. Таким образом, различным частям приложения можно передавать лишь небольшие разделы фабрики.

Например, допустим„что некий модуль (5цгрг)зев. срр) должен создавать только объекты класса 5ирегмопзтег. Этому модулю можно передавать только указатели или ссылки на объекты класса абзтгасткассогу<5ирегыопзтег>, так что МОДУль 5игрг)вез. срр не свлзан ни с классом 5о1о1ег, ни с классом мопзтег. Используя модульность класса АЬзтгастеассогу, можно сократить количество связей, задействованных в шаблоне проектирования АЬзтгасс кастогу. Это не снизит степень безопасности интерфейса абстрактной фабрики, поскольку людульным является только интерфейс, а не реализация класса.

Итак, перед нами встает проблема реализации интерфейса. Второе важное преимушество автоматически сгенерированной версии класса АЬзтгассепевукассогу заключаетсл в том, что его реализация также генерируется автоматически. 9.3. Реализация класса АЬатгас1Рас1огу Определив интерфейс, перейдем к реализации класса, стремясь сделать это как можно проще. Поскольку интерфейс использует списки типов, естественно построить обобщен- ную реализацию класса АЬзтгасткастогу с помощью списков типов конкретных из- делий. С практической точки зрения реализация класса, соответствующего легкому уровню игры, должна выглядеть следующим образом. // код приложения туреоеГ Сопсгесекастогу < // дбстрактнал фабрика, подлежащая реализации АЬзсгастЕпевукастогу, // Стратегия создания объектов // (например, с помощью оператора пем) Ормемпастогуцп)с, // конкретные классы, создаваемые данной фабрикой тчреьт5т 3(5111у5о1озег, 5з11умопзСЕг, 5111увирегМопзтег) > Еазуьече1Епевугассогу; Три аргумента гипотетического (пока) шаблонного класса сопсгегекастогу со- держат достаточно информации, чтобы полностью реализовать фабрику.

° Класс АЬзтгастепевукастогу описывает интерфейс абстрактной фабрики, подлежащей реализации, и неявно задает список изделий, ° Класс Орыемкастогуцпзт представляет собой стратегию, определлюшую, каким образом осуществляется фактическое создание объектов. 245 Глава 9, Шаблон АЬатгас1 гас1огу ° Список типов содержит набор классов, создаваемых фабрикой. Каждый конкретный тип, указанный в списке, соответствует абстрактному типу с тем же индексом в списке типов класса аЬзсгассгассогу. Например, класс вз!)умопзсег (индекс 1) представляет собой конкретную разновидность класса мопзсег„ имеющую тот же индекс в определении класса дЬзсгассвпемугассогу.

Описав класс сопзгесегассогу, попробуем его реализовать. Немного поразмыслив, легко прийти к выводу, что количество замещений чисто виртуальных функций должно совпадать с количеством определений класса. (В противном случае мы не смогли бы конкретизировать класс сопсгесегассогу.) Следовательно, класс сопсгеСегассогу должен быть производным от класса Орнеигасеогупп(С, отвечающего за реализацию функции ОоСгеаСе.

Здесь большую помощь может оказать шаблонный класс реп)(пеагнзегагсву (глава 3), поскольку в нем предусмотрены все детали генерации нужных нам реализаций. Класс аЬвсгассвпемугассогу должен быть корнем иерархии. Все реализации фуНКцИИ ООСгеате и окончательный класс аазуЬече)впемугассогу должны быть производными от него. В каждой реализации класса Ормеияастогуппз С дОЛжна замешаться одна из трех чисто виртуальных функций Оосгеасе, определенных в классе дЬзсгассвпемугассогу. Определим класс Орнеигассогуцпзс. Очевидно, класс Орнеигассогуцпзс — это шаблонный класс, получающий тип создаваемого объекта в качестве шаблонного параметра. Кроме того, класс аепсзпеагндегагсйу требует, чтобы класс Орнеигассогуцпдс получал дополнительный шаблонный параметр и был его потомком.

Характеристики

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6485
Авторов
на СтудИзбе
303
Средний доход
с одного платного файла
Обучение Подробнее