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

Создание новых объектов является наиболее распространенной задачей, встающей перед разработчиками программных систем. Порождающие паттерны проектирования предназначены для создания объектов, позволяя системе оставаться независимой как от самого процесса порождения, так и от типов порождаемых объектов. Прежде чем рассматривать особенности каждого из порождающих паттернов, рассмотрим на примере типичные проблемы, встающие перед разработчиками при порождении в системе объектов новых типов на примере разработки стратегической игры под названием «Пунические войны», описывающей военное противостояние между Римской республикой и Карфагеном (264—146 гг. до н. э.) [59].

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

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

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

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

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

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

 
< Пред   СОДЕРЖАНИЕ     След >