Prototype Pattern Deep Copy

				
					using Newtonsoft.Json;

namespace prototypepattern
{
    public interface  Person
    {
        public string Name { get; set; }
        public Person Clone(bool deepclone);
    }

    public class Manager : Person
    {
        public  string Name { get; set; }

        public Manager(string name)
        {
            Name = name;
        }

        public Person Clone(bool deepclone=false)
        {
            if (deepclone)
            {
                var jsonObject = JsonConvert.SerializeObject(this);
                return JsonConvert.DeserializeObject<Manager>(jsonObject);
            }
            return (Person)MemberwiseClone();
        }
    }

    public class Employee : Person
    {
        public string Name { get; set; }
        public Manager Manager { get; set; }
        public Employee(string name, Manager manager)
        {
            Name = name;
            Manager = manager;
        }
        public Person Clone(bool deepclone=false)
        {
            if (deepclone)
            {
                var jsonObject = JsonConvert.SerializeObject(this);
                return JsonConvert.DeserializeObject<Employee>(jsonObject);
            }
            return (Person)MemberwiseClone();
        }
    }
}

				
			
				
					// See https://aka.ms/new-console-template for more information



using prototypepattern;

var manager = new Manager("Anurag");
var managerClone = (Manager)manager.Clone();
Console.WriteLine($"Cloned Manager::{managerClone.Name}");

var employee = new Employee("Narasimha", managerClone);
var employeeclone = (Employee)employee.Clone(true);
Console.WriteLine($"Employee is {employeeclone.Name} & manager is {employeeclone.Manager.Name}");

managerClone.Name = "Abhishek";
Console.WriteLine($"Employee is {employeeclone.Name} & manager is {employeeclone.Manager.Name}");


				
			

Cloned Manager::Anurag
Employee is Narasimha & manager is Anurag
Employee is Narasimha & manager is Anurag

Leave a Comment