Прототип (Prototype)

Шаблон Прототип описывает способ построения новых объектов путём клонирования существующих объектов. Обычно объект создаётся при помощи вызова конструктора. Если же используется шаблон Прототип, то клиент знает только об интерфейсе или базовом классе, содержащем метод клонирования. Реальный класс объекта клиенту неизвестен. Прототипы для клонирования могут использоваться произвольное количество раз, сами они при операции клонирования меняться не должны. Хотя существуют различные варианты дизайна данного шаблона, наиболее гибким является вариант с менеджером прототипов, содержащим индексированный список доступных прототипов.

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

// тип T также должен быть сериализуемым

[Serializable]

public abstract class Prototype<T>

{

// поверхностное копирование

public virtual T Clone()

{

return (T) MemberwiseClone();

}

 

// глубокое копирование

public virtual T DeepCopy()

{

using (var stream = new MemoryStream())

{

var context =

new StreamingContext(StreamingContextStates.Clone);

var formatter = new BinaryFormatter {Context = context};

formatter.Serialize(stream, this);

stream.Position = 0;

return (T) formatter.Deserialize(stream);

}

}

}

 

// конкретный класс, использующий описанные механизмы копирования

[Serializable]

public class Student : Prototype<Student>

{

public Guid Id { get; set; }

public string Name { get; set; }

}

 

// использование шаблона Прототип

var student = new Student {Name = "Alex"};

var clone = student.Clone();

 

// иногда после клонирования нужно переопределить

// часть свойств объекта

clone.Id = Guid.NewGuid();