Шаблон Прототип позволяет создавать новые объекты путем клонирования уже существующих.
Данный шаблон используется в случаях, если:
- система не должна зависеть от способа создания и реализации входящих в нее объектов;
- класс порождаемого объекта определяется в момент выполнения;
- (или) создание копии объекта проще и быстрее, чем порождение его стандартным путем, используя операцию new и включая инициализацию полей;
- (или) необходимо создать объект в определенном состоянии (по образцу или одному из образцов);
- (или) желательно избежать наследования создателя объекта. В этом случае, Прототип является конкурентом Абстрактной фабрики.
Прототип, как и многие другие порождающие шаблоны, скрывает реализацию создаваемого объекта.
Нередко, создание нового объекта осуществляется вызовом метода клонируемого. Но возможны ситуации, когда в системе существует большое количество объектов-прототипов или есть необходимость в эталонных прототипах. В этих случаях, реализация шаблона Прототип может включать Фабричный метод или Абстрактную фабрику для создания, хранения и управления ими.
При объединении Прототипа и параметризованного Фабричного метода можно получить интересную возможность динамически добавлять новые типы объектов, доступные для порождения. Пример будет приведен позже.
Схожие шаблоны и их отличия
Прототип:
- Скрывает реализацию объекта.
- Метод класса или интерфейса, может включать фабрику.
- Создает копию объекта.
Фабричный метод / Абстрактная фабрика:
те-же пункты, за исключением того, что создается новый объект.
Пул объектов:
- Порождает требуемые реализации, но может предоставлять и интерфейсы.
- Класс.
- Выдает существующий объект во временное пользование.
Реализация шаблона в общем виде
- разрабатываем интерфейс или базовый класс, содержащий метод клонирования Clone();
- создаем реализации или потомков, включая их варианты метода клонирования;
- при необходимости, создаем фабрику, которая используется для управления прототипами;
- в клиентском коде, для создания нового объекта, обращаемся к объекту или фабрике.
Пример
Рассмотрим работу паттерна на примере клонирования овечки "Долли"
Объявим интерфейс IAnimal
Реализуем интерфейс в классе Sheep
Посмотрим применение паттерна