Образец создания: прототип

Dec 04 2022
В этой статье обсуждается, как новые объекты могут быть созданы из существующих объектов с использованием шаблона прототипа. Что это? Шаблон прототипа — это шаблон создания, в котором новые объекты создаются путем копирования существующего объекта.

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

Что это?

Шаблон прототипа — это шаблон создания, в котором новые объекты создаются путем копирования существующего объекта. Объект, копии которого сделаны, называется прототипом . Чтобы лучше понять объекты, вы можете рассматривать объект-прототип как «семя», из которого создаются все остальные объекты. Поэтому вы можете спросить, почему бы вам не создавать новые объекты, когда это необходимо, вместо того, чтобы клонировать существующие. Мотивы создания объектов-прототипов следующие:

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

Диаграмма классов

Диаграмма классов содержит следующие сущности:

  • Прототип
  • Бетонный прототип
  • Клиент

Давайте возьмем пример самолета, чтобы лучше понять модель прототипа. Во-первых, мы создали класс для представления F-16. Но мы знаем, что у F-16 есть несколько модификаций. Таким образом, для представления каждого из вариантов F16 мы можем создать подклассы. Но тогда мы получим несколько подклассов в нашей системе. Кроме того, предположим, что варианты F16 отличаются только типами двигателей. Тогда можно было бы сохранить один класс F16, но добавить метод для установки типа двигателя самолета. Таким образом, мы можем создать один объект F16 в качестве прототипа и клонировать его для различных версий самолета.

Во-первых, мы создаем интерфейс.

Класс F-16 реализует свой интерфейс следующим образом:

Клиент может использовать такой шаблон:

Обратите внимание, что метод clone интерфейса IAircraftPrototype возвращает абстрактный тип . Клиенты не знают, какие разные реализации одного и того же интерфейса создадут конкретные подклассы. Например, класс Boeing747 может быть передан, создавая копии любого переданного прототипа (F16 или Boeing747). Шаблон прототипа помогает исключить создание подклассов, поскольку поведение объектов-прототипов можно варьировать, объединяя их с подчастями.

Поверхностное и глубокое копирование

Шаблон прототипа требует, чтобы класс прототипа или интерфейс реализовывали метод clone() . Клонирование может быть как поверхностным, так и глубоким. Например, если наш класс F-16 имеет объект-член типа F16Engine , в неглубокой копии клонированный объект будет указывать на тот же объект F16Engine , что и прототип. Но в глубокой копии клонированный объект получит свою копию объекта механизма и любые объекты, вложенные в него. Не будет никакого совместного использования каких-либо полей — вложенных или иных — между прототипом и его клоном.

Динамическая загрузка

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

Другие примеры

В языке программирования Java класс Object имеет метод clone. Класс реализует интерфейс java.lang.Cloneable .

Предостережения

Реализация метода клонирования может быть затруднена из-за циклических ссылок.

Другие статьи из серии Creational Pattern