原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而又无需使代码依赖它们所属的类。
解释  
原型模式将克隆过程委派给被克隆的实际对象。模式为所有支持克隆的对象声明了一个通用接口,该接口让你能够克隆对象,同时又无需将代码和对象所属类耦合。通常情况下,这样的接口中仅包含一个克隆 方法。
所有的类对克隆方法的实现都非常相似。该方法会创建一个当前类的对象,然后将原始对象所有的成员变量值复制到新建的类中。你甚至可以复制私有成员变量,因为绝大部分编程语言都允许对象访问其同类对象的私有成员变量。
原型模式 UML  
适用场景  
如果你需要复制一些对象,同时又希望代码独立于这些对象所属的具体类,可以使用原型模式 
如果子类的区别仅在于其对象的初始化方式,那么你可以使用该模式来减少子类的数量 
 
代码示例  
using  System;namespace  PrototypePatternDemo   {     public  class  Person      {         public  int  Age;         public  DateTime BirthDate;         public  string  Name;         public  IdInfo IdInfo;         public  Person ShallowCopy ( )         {             return  (Person) this .MemberwiseClone();         }         public  Person DeepCopy ( )         {             Person clone = (Person) this .MemberwiseClone();             clone.IdInfo = new  IdInfo(IdInfo.IdNumber);             clone.Name = String.Copy(Name);             return  clone;         }     }     public  class  IdInfo      {         public  int  IdNumber;         public  IdInfo (int  idNumber )         {             this .IdNumber = idNumber;         }     }     class  Program      {         static  void  Main (string [] args )         {             Person p1 = new  Person();             p1.Age = 42 ;             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: " );             DisplayValues(p1);             Console.WriteLine("   p2 instance values:" );             DisplayValues(p2);             Console.WriteLine("   p3 instance values:" );             DisplayValues(p3);             p1.Age = 32 ;             p1.BirthDate = Convert.ToDateTime("1900-01-01" );             p1.Name = "Frank" ;             p1.IdInfo.IdNumber = 7878 ;             Console.WriteLine("\nValues of p1, p2 and p3 after changes to p1:" );             Console.WriteLine("   p1 instance values: " );             DisplayValues(p1);             Console.WriteLine("   p2 instance values (reference values have changed):" );             DisplayValues(p2);             Console.WriteLine("   p3 instance values (everything was kept the same):" );             DisplayValues(p3);                                                                                                                                                                                                                                                                                          }         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);         }     } }