static void Main(string[] args) { // Простое создание клона вручную Prototype prototypeA = new ConcretePrototypeA("Prototype A"); Prototype clone1 = prototypeA.Clone(); Console.WriteLine(prototypeA.Name); Console.WriteLine(clone1.Name); // Продвинутое создание клона, так же с клонированием ссылочных типов Dependency dependency = new Dependency("Dependency A1"); CloneablePrototypeAdvanced cloneablePrototype = new CloneablePrototypeAdvanced("Clone", dependency); CloneablePrototypeAdvanced clone2 = cloneablePrototype.Clone() as CloneablePrototypeAdvanced; // Убедимся, что после клонирования, при изменении dependency, ссылочный тип клона не изменится dependency.SetText("Dependency A2"); Console.WriteLine(cloneablePrototype.GetDependencyText()); Console.WriteLine(clone2.GetDependencyText()); // Реализация через фабрику ConcretePrototypeN prototypeN = PrototypeFactory.CreatePrototypeN(); Prototype clone3 = prototypeN.Clone(); Console.WriteLine(prototypeN.Name); Console.WriteLine(clone3.Name); Console.ReadLine(); }
// Переопределив данный метод, данный код будет срабатывать при вызове Clone() protected override void HandleCloned(CloneableBase baseClone) { // Выполняем операции из базового класса base.HandleCloned(baseClone); // Приводим клона к текущему типу CloneablePrototypeAdvanced clone = (CloneablePrototypeAdvanced)baseClone; // Дополнительная логика. Здесь, например, происходит копирование ссылочной // сущности clone.Dependency = new Dependency(this.Dependency.Text); }