原型模式是用于创建重复的对象,同时又能保证性能, 当直接创建对象的代价比较大时例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
   |  class Resume {     private string name;     private string sex;     private string age;     private string timeArea;     private string compart;
      public Resume(string name)     {         this.name = name;     }     public void SetPersonalInfo(string sex, string age)     {         this.sex = sex;         this.age = age;     }     public void SetWorkExperience(string timeArea, string company)     {         this.timeArea = timeArea;         this.company = company;     }     public void Display()     {         Console.WriteLine("{0} {1} {2}", name, sex, age);         Console.WriteLine("工作经历: {0} {1}", timeArea, company);     } }
  Resume a = new Resume("小a"); a.SetPersonalInfo("男", "21"); a.SetWorkExperience("2021-2022", "a公司"); Resume b = new Resume("小a"); b.SetPersonalInfo("男", "21"); b.SetWorkExperience("2022-2023", "b公司");
  a.Display(); b.Display();
 
  | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
   |  class Resume : ICloneable {     private string name;     private string sex;     private string age;     private string timeArea;     private string compart;
      public Resume(string name)     {         this.name = name;     }     public void SetPersonalInfo(string sex, string age)     {         this.sex = sex;         this.age = age;     }     public void SetWorkExperience(string timeArea, string company)     {         this.timeArea = timeArea;         this.company = company;     }     public void Display()     {         Console.WriteLine("{0} {1} {2}", name, sex, age);         Console.WriteLine("工作经历: {0} {1}", timeArea, company);     }     public Object Clone()     {                  return (Object)this.MemberwiseClone();     } }
  Resume a = new Resume("小a"); a.SetPersonalInfo("男", "21"); a.SetWorkExperience("2021-2022", "a公司"); Resume b = (Resume)a.Clone(); b.SetWorkExperience("2022-2023", "b公司");
  a.Display(); b.Display();
 
  | 
 
浅拷贝存在的问题: 对于引用类型只是拷贝其引用, 创建多个对象后引用类型都指向同一对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
   | class WorkExperence {     private string workDate;     public string WorkDate     {         get{return workDate;}         set{workDate = value;}     }     public string company; } class Resume : ICloneable {     private string name;     private string sex;     private string age;     private WorkExperence work;
      public Resume(string name)     {         this.name = name;         work = new WorkExperence();     }     public void SetPersonalInfo(string sex, string age)     {         this.sex = sex;         this.age = age;     }     public void SetWorkExperience(string timeArea, string company)     {         work.WorkDate = timeArea;         work.Company = company;     }     public void Display()     {         Console.WriteLine("{0} {1} {2}", name, sex, age);         Console.WriteLine("工作经历: {0} {1}", timeArea, company);     }     public Object Clone()     {                  return (Object)this.MemberwiseClone();     } }
  Resume a = new Resume("小a"); a.SetPersonalInfo("男", "21"); a.SetWorkExperience("2021-2022", "a公司"); Resume b = (Resume)a.Clone(); b.SetWorkExperience("2022-2023", "b公司");
  a.Display(); b.Display();
   | 
 
深拷贝需要考虑要深入到多少层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
   |  class WorkExperence : ICloneable {     private string workDate;     public string WorkDate     {         get{return workDate;}         set{workDate = value;}     }     public string company;     public Object Clone()     {                  return (Object)this.MemberwiseClone();     } } class Resume : ICloneable {     private string name;     private string sex;     private string age;     private WorkExperence work;
      public Resume(string name)     {         this.name = name;         work = new WorkExperence();     }     public Resume(WorkExperence work)     {         this.work = (WorkExperence)work.Clone();     }     public void SetPersonalInfo(string sex, string age)     {         this.sex = sex;         this.age = age;     }     public void SetWorkExperience(string timeArea, string company)     {         work.WorkDate = timeArea;         work.Company = company;     }     public void Display()     {         Console.WriteLine("{0} {1} {2}", name, sex, age);         Console.WriteLine("工作经历: {0} {1}", timeArea, company);     }     public Object Clone()     {                  Resume obj = new Resume(this.work);         obj.name = this.name;         obj.sex = this.sex;         obj.age = this.age;         return obj;     } }
  Resume a = new Resume("小a"); a.SetPersonalInfo("男", "21"); a.SetWorkExperience("2021-2022", "a公司"); Resume b = (Resume)a.Clone(); b.SetWorkExperience("2022-2023", "b公司");
  a.Display(); b.Display();
 
  |