Обзор темы [Шаблоны проектирования]

Затем: МотивацияНазначение

Определяет виды создаваемых объектов, используя в качестве прототипа определенный обект, и создает новые объекты, копируя этот прототип.

Затем: СтруктураМотивация

Вы могли бы создать редактор для написания музыки, реализуя его как графический редактор, позволяющий добавлять новые объекты, - ноты, паузы и дуги. Редактор может иметь набор инструментальных средств для добавления этих объектов в документ. Этот набор также включил бы инструментальные средства для выбора, перемещения и манипулирования музыкальными объектами. Пользователи нажмут на кнопку "четверть" и будут добавлять ноты соответствующей длительности. Или они могут использовать инструмент перемещения, чтобы переместить ноту вверх или вниз, таким образом, изменяя ее тон.

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

Но в связи с появлением GraphicTool возникает проблема. Классы для нот и дуг специфичны для нашего приложения, но класс GraphicTool принадлежит каркасу приложения. GraphicTool не знает, как создать образцы наших классов музыки, чтобы их добавить. Мы могли бы создавать подклассы GraphicTool для каждого вида объекта, но это вызовет появление большого количества подклассов, отличающихся только по виду объекта музыки, который они инстанцируют. Мы знаем, что гибкой альтернативой наследования является объектная композиция. Вопрос, как каркас может использовать ее для параметризации экземпляров GraphicTool классом Graphic, который необходимо создать?

Решение заключается том, чтобы заставить GraphicTool создавать новый Graphic, копируя или клонируя образец подкласса Graphic. Мы называем этот образец прототипом. GraphicTool - параметризованный прототип, который добавляется к документу. Если все подклассы Graphic поддерживают операцию Clone, то GraphicTool может имитировать любой вид Graphic.

Таким образом, в нашем музыкальном редакторе, каждый инструмент для создания объекта музыки - экземпляр GraphicTool, инициализированный с различным прототипом. Каждый элемент GraphicTool производит музыкальный объект, клонируя свой прототип и добавляя его на стан.

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

Затем: Составные частиСтруктура

Затем: КонецСоставные части