zoukankan      html  css  js  c++  java
  • 原型模式

    前言

      原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

      .NE在System命名空间中提供了ICloneable接口,其中就是唯一的一个方法Clone(),这样只需要实现这个接口就可以完成原型模式。

      MemberwiseClone()方法:如果是值类型,则该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象。意思就是如果“简历”类中有对象引用,那么引用的对象数据是不会被克隆的。

    一、工作经历类

     1     /// <summary>
     2     /// 1、工作经历类
     3     /// 2、ICloneable支持克隆,即用与现有实例相同的值创建类的新实例。
     4     /// </summary>
     5     public class WorkExperience : ICloneable
     6     {
     7         public string WorkDate { get; set; }
     8         public string Company { get; set; }
     9         public object Clone()
    10         {
    11             //返回当前 System.Object 的浅表副本。
    12             return this.MemberwiseClone();
    13         }
    14     }

    二、简历类

      

     1   public class Resume : ICloneable
     2     {
     3         private string name;
     4         private string sex;
     5         private string age;
     6         private WorkExperience work;
     7         public Resume(string name)
     8         {
     9             this.name = name;
    10             work = new WorkExperience();
    11         }
    12         private Resume(WorkExperience work)
    13         {
    14             //提供Clone方法调用自己的私有构造函数,以便克隆“工作经历”的数据
    15             this.work = (WorkExperience)work.Clone();
    16         }
    17         //设置个人信息
    18         public void SetPersonalInfo(string sex,string age)
    19         {
    20             this.sex = sex;
    21             this.age = age;
    22         }
    23         //设置工作经历
    24         public void SetWorkExperience(string workDate,string company)
    25         {
    26             work.WorkDate = workDate;
    27             work.Company = company;
    28         }
    29         public void Display()
    30         {
    31             Console.WriteLine("{0} {1}{2}", name, sex, age);
    32             Console.WriteLine("工作经历:{0}{1}", work.WorkDate, work.Company);
    33         }
    34         /// <summary>
    35         /// 调用私有构造函数,让“工作经历”克隆完成,然后再给这个“简历”对象的相关字段赋值,
    36         /// 最终返回一个深赋值的简历对象
    37         /// </summary>
    38         /// <returns></returns>
    39         public object Clone()
    40         {
    41             Resume obj = new Resume(this.work);
    42             obj.name = this.name;
    43             obj.sex = this.sex;
    44             obj.age = this.age;
    45             return obj;
    46         }
    47     }

    三、测试

      

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Resume a = new Resume("甜甜");
     6             a.SetPersonalInfo("", "23");
     7             a.SetWorkExperience("2000-2003", "aa公司");
     8             a.Display();
     9 
    10             Resume b = (Resume)a.Clone();
    11             b.SetWorkExperience("2006-2010", "bb公司");
    12             b.Display();
    13 
    14             Console.ReadKey();
    15         }
    16     }

    总结:

      1、浅复制:被复制的对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。

      2、深复制:把引用对象变量指向复制过的新对象,而不是原有的被引用的对象。

      参考书籍:大话设计模式

  • 相关阅读:
    leetcode-344-反转字符串
    leetcode-136-只出现一次的数字
    leetcode-350- 两个数组的交集 II
    leetcode-36-有效的数独
    leetcode-283-移动零
    leetcode-387-字符串中的第一个唯一字符
    leetcode-242-有效的字母异位词
    HDU 2612
    Codeforces 1090B
    Codeforces 1090D
  • 原文地址:https://www.cnblogs.com/hyunbar/p/9850096.html
Copyright © 2011-2022 走看看