Найти тему
using Dev

Прототип C#

Оглавление

Шаблон Прототип позволяет создавать новые объекты путем клонирования уже существующих.

Данный шаблон используется в случаях, если:

  • система не должна зависеть от способа создания и реализации входящих в нее объектов;
  • класс порождаемого объекта определяется в момент выполнения;
  • (или) создание копии объекта проще и быстрее, чем порождение его стандартным путем, используя операцию new и включая инициализацию полей;
  • (или) необходимо создать объект в определенном состоянии (по образцу или одному из образцов);
  • (или) желательно избежать наследования создателя объекта. В этом случае, Прототип является конкурентом Абстрактной фабрики.

Прототип, как и многие другие порождающие шаблоны, скрывает реализацию создаваемого объекта.

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

При объединении Прототипа и параметризованного Фабричного метода можно получить интересную возможность динамически добавлять новые типы объектов, доступные для порождения. Пример будет приведен позже.

Схожие шаблоны и их отличия

Прототип:

- Скрывает реализацию объекта.

- Метод класса или интерфейса, может включать фабрику.

- Создает копию объекта.

Фабричный метод / Абстрактная фабрика:

те-же пункты, за исключением того, что создается новый объект.

Пул объектов:

- Порождает требуемые реализации, но может предоставлять и интерфейсы.

- Класс.

- Выдает существующий объект во временное пользование.

Реализация шаблона в общем виде

  • разрабатываем интерфейс или базовый класс, содержащий метод клонирования Clone();
  • создаем реализации или потомков, включая их варианты метода клонирования;
  • при необходимости, создаем фабрику, которая используется для управления прототипами;
  • в клиентском коде, для создания нового объекта, обращаемся к объекту или фабрике.

Пример

Рассмотрим работу паттерна на примере клонирования овечки "Долли"

Объявим интерфейс IAnimal

-2

Реализуем интерфейс в классе Sheep

-3

Посмотрим применение паттерна

-4
-5