namespace RefactoringGuru.DesignPatterns.Prototype.Conceptual
public DateTime BirthDate;
public Person ShallowCopy()
return (Person) this.MemberwiseClone();
Person clone = (Person) this.MemberwiseClone();
clone.IdInfo = new IdInfo(IdInfo.IdNumber);
clone.Name = String.Copy(Name);
public IdInfo(int idNumber)
this.IdNumber = idNumber;
public void Main(string[] args)
Person p1 = new Person();
p1.BirthDate = Convert.ToDateTime("1977-01-01");
p1.Name = "Jack Daniels";
p1.IdInfo = new IdInfo(666);
Person p2 = p1.ShallowCopy();
Person p3 = p1.DeepCopy();
Console.WriteLine("Original values of p1, p2, p3:");
Console.WriteLine(" p1 instance values: ");
Console.WriteLine(" p2 instance values:");
Console.WriteLine(" p3 instance values:");
p1.BirthDate = Convert.ToDateTime("1900-01-01");
p1.IdInfo.IdNumber = 7878;
Console.WriteLine("\nValues of p1, p2 and p3 after changes to p1:");
Console.WriteLine(" p1 instance values: ");
Console.WriteLine(" p2 instance values (reference values have changed):");
Console.WriteLine(" p3 instance values (everything was kept the same):");
public static void DisplayValues(Person p)
Console.WriteLine(" Name: {0:s}, Age: {1:d}, BirthDate: {2:MM/dd/yy}",
p.Name, p.Age, p.BirthDate);
Console.WriteLine(" ID#: {0:d}", p.IdInfo.IdNumber);