Студопедия — Применение. Алан Шаллоуей, Джеймс Р. Тротт Шаблоны проектирования
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Применение. Алан Шаллоуей, Джеймс Р. Тротт Шаблоны проектирования






Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес Приемы объектно-ориентированного проектирования. Паттерны проектирования = Design Patterns: Elements of Reusable Object-Oriented Software. — СПб: «Питер», 2007. — С. 366.

 

Алан Шаллоуей, Джеймс Р. Тротт Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М.: «Вильямс», 2002. — С. 288.

 

Порождающие паттерны проектирования

Абстрагируют процесс инстанцирования. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять инстанцируемый класс, а шаблон, порождающий объекты, делегирует инстанцирование другому объекту.

Инстанцирование — создание экземпляра класса. В отличие от слова «создание», применяется не к объекту, а к классу. То есть, говорят: «(в виртуальной среде) создать экземпляр класса или инстанцировать класс». Порождающие шаблоны используют полиморфное инстанцирование.

 

Использование

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

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

Иногда допустимо выбирать между тем или иным порождающим шаблоном. Например, есть случаи, когда с пользой для дела можно использовать как прототип, так и абстрактную фабрику. В других ситуациях порождающие шаблоны дополняют друг друга. Так, применяя строитель, можно использовать другие шаблоны для решения вопроса о том, какие компоненты нужно строить, а прототип часто реализуется вместе с одиночкой. Порождающие шаблоны тесно связаны друг с другом, их рассмотрение лучше проводить совместно, чтобы лучше были видны их сходства и различия.

 

 

Перечень порождающих паттернов

К порождающим паттернам проектирования относятся следующие:

· абстрактная фабрика (abstract factory);

· строитель (builder);

· фабричный метод (factory method);

· прототип (prototype);

· одиночка (singleton)

 

Абстрактная фабрика

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

 

Назначение

Предоставляет интерфейс для создания семейств, взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.

Достоинства

· изолирует конкретные классы;

  • упрощает замену семейств продуктов;
  • гарантирует сочетаемость продуктов.

 

Недостатки

· сложно добавить поддержку нового вида продуктов.

Применение

· Система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты.

· Входящие в семейство взаимосвязанные объекты должны использоваться вместе и вам необходимо обеспечить выполнение этого ограничения.

· Система должна конфигурироваться одним из семейств составляющих ее объектов.

· Требуется предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию.

 

 

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

 

Пример

#include <iostream>

 

// Абстрактный ProductA

class Car

{ public:

virtual void info() = 0;

virtual ~Car(){}

};

 

// Конкретный ProductA1

class Ford: public Car

{ public:

virtual void info()

{ std::cout << "Ford" << std::endl; }

};

 

// Конкретный ProductA2

class Toyota: public Car

{ public:

virtual void info()

{ std::cout << "Toyota" << std::endl; }

};

 

// Абстрактный ProductВ

class Engine

{ public:

virtual void getPower() = 0;

virtual ~Engine(){}

};

 

// Конкретный ProductB1

class FordEngine: public Engine

{ public:

virtual void getPower()

{ std::cout << "Ford Engine 4.4" << std::endl; }

};

 

// Конкретный ProductB2

class ToyotaEngine: public Engine

{ public:

virtual void getPower()

{ std::cout << "Toyota Engine 3.2" << std::endl; }

};

 

 

// AbstractFactory

class CarFactory

{ public:

Car* getNewCar()

{ return createCar(); }

 

Engine* getNewEngine()

{ return createEngine(); }

 

virtual ~ CarFactory(){}

protected:

virtual Car* createCar() = 0;

virtual Engine* createEngine() = 0;

};

 

// Конкретная Factory1

class FordFactory: public CarFactory

{ protected:

// from CarFactory

virtual Car* createCar()

{ return new Ford(); }

 

virtual Engine* createEngine()

{ return new FordEngine(); }

};

 

// Конкретная Factory2

class ToyotaFactory: public CarFactory

{ protected:

// from CarFactory

virtual Car* createCar()

{ return new Toyota(); }

 

virtual Engine* createEngine()

{ return new ToyotaEngine(); }

};

 

int main()

{

CarFactory* curFactory = NULL;

Car* myCar = NULL;

Engine* myEngine = NULL;

 

ToyotaFactory toyotaFactory;

FordFactory fordFactory;

 

curFactory = &toyotaFactory;

 

myCar = curFactory->getNewCar();

myCar->info();

myEngine = curFactory->getNewEngine();

myEngine->getPower();

delete myCar;

delete myEngine;

 

 

curFactory = &fordFactory;

myCar = curFactory->getNewCar();

myCar->info();

myEngine = curFactory->getNewEngine();

myEngine->getPower();

delete myCar;

delete myEngine;

return 0;

}

 

 







Дата добавления: 2015-09-15; просмотров: 514. Нарушение авторских прав; Мы поможем в написании вашей работы!



Картограммы и картодиаграммы Картограммы и картодиаграммы применяются для изображения географической характеристики изучаемых явлений...

Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Седалищно-прямокишечная ямка Седалищно-прямокишечная (анальная) ямка, fossa ischiorectalis (ischioanalis) – это парное углубление в области промежности, находящееся по бокам от конечного отдела прямой кишки и седалищных бугров, заполненное жировой клетчаткой, сосудами, нервами и...

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

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

Типовые ситуационные задачи. Задача 1. Больной К., 38 лет, шахтер по профессии, во время планового медицинского осмотра предъявил жалобы на появление одышки при значительной физической   Задача 1. Больной К., 38 лет, шахтер по профессии, во время планового медицинского осмотра предъявил жалобы на появление одышки при значительной физической нагрузке. Из медицинской книжки установлено, что он страдает врожденным пороком сердца....

Типовые ситуационные задачи. Задача 1.У больного А., 20 лет, с детства отмечается повышенное АД, уровень которого в настоящее время составляет 180-200/110-120 мм рт Задача 1.У больного А., 20 лет, с детства отмечается повышенное АД, уровень которого в настоящее время составляет 180-200/110-120 мм рт. ст. Влияние психоэмоциональных факторов отсутствует. Колебаний АД практически нет. Головной боли нет. Нормализовать...

Эндоскопическая диагностика язвенной болезни желудка, гастрита, опухоли Хронический гастрит - понятие клинико-анатомическое, характеризующееся определенными патоморфологическими изменениями слизистой оболочки желудка - неспецифическим воспалительным процессом...

Studopedia.info - Студопедия - 2014-2024 год . (0.008 сек.) русская версия | украинская версия