Прототип (Prototype)

Метафора

 

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

 

Назначение

 

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

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

 

Диаграмма

 

Прототип

Прототип

 

Пример

 

В примере вместо повторной инициализации объекта используется метод его клонирования с передачей состояния. Для упрощения инициализация происходит прямо в конструкторе (запрос лучше отправлять в отдельном методе, а конструктор оставить только для присвоения состояния).

В других языках программирования есть встроенные механизмы для копирования объектов, в ABAP такой механизм так же имеется, реализован через системный вызов (см. класс cl_os_state):