Образец «Creator»

Проблема:

Нужно определить, кто должен отвечать за создание нового экземпляра некоторого класса. Создание новых объектов в объ­ектно-ориентированной системе является одним из стандартных видов деятельности. Следовательно, при назначении обязаннос­тей, связанных с созданием объектов, полезно руководствоваться некоторым основным принципом.

Решение:

Следует назначить классу В обязанность создавать экземпля­ры класса А, если выполняется одно из следующих условий:

· класс В агрегирует, содержит или активно использует объек­ты класса А;

· класс В обладает данными инициализации, которые будут передаваться объектам класса А при их создании (т.е. класс В является информационным экспертом).

Класс В при этом определяется как создатель (creator) объек­тов класса А.

Если несколько классов удовлетворяют этим условиям, то предпочтительнее использовать в качестве создателя класс, агре­гирующий или содержащий класс А.

Пример:

При выполнении подчиненного потока событий «Создать график» варианта использования «Зарегистрироваться на курсы» (см. рис. 4.8) необходимо решить, кто должен отвечать за создание нового графика в системе. На рисунке 4.13 показано два возможных варианта решения этой задачи.

Рис. 4.13. Два варианта создания графика

В диаграмме на рис. 4.8 выбран вариант 1. Однако согласно образцу «Creator» наилучшим решением является вариант 2 (но­вый объект класса Schedule создается классом Student, а не RegistrationController, поскольку именно Student удовлетворяет первому из перечисленных выше условий).

Следствия:

Образец «Creator» определяет способ распределения обязан­ностей, связанный с процессом создания объектов. В объектно-ориентированных системах эта задача является одной из наибо­лее распространенных. Основным назначением образца Creator является выявление объекта-создателя, который при возникно­вении любого события должен быть связан со всеми созданными им объектами. При таком подходе обеспечивается низкая сте­пень связанности объектов.

В некоторых случаях в качестве создателя выбирается класс, который содержит данные инициализации, передаваемые объек­ту во время его создания. На самом деле это пример использова­ния образца Information Expert. В процессе создания инициали­зирующие данные передаются с помощью метода инициализа­ции некоторого вида, такого, как конструктор языка программи­рования.

В некоторых сложных случаях вместо данного образца пред­почтительнее использовать известный образец Factory (Фабри­ка)[27] и делегировать обязанность создания объектов вспомога­тельному классу.




double arrow
Сейчас читают про: