前言
书上这个代码不少,改动的地方比较多把,而且还介绍了一个深浅复制,让我们进一步去看看是怎样一步一步学到深复制的?原型模式有是怎样的呢?
原型模式
英文:Prototype
what:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
这句话有些复杂,简单来说原型模式就是从一个对象再创建另外一个可制定的对象,而且不需知道任何创建的细节。
这里也给大家提供了ICloneable接口
场景
写简历,需要有不同时间的工作经历,但是姓名,性别等信息是确定的。对于一些不需要修改的信息就可以进行克隆,修改变化的信息就可以生成新的简历了。
应用
一般在初始化的信息不发生变化的情况下,克隆是最好的办法。既隐藏了对象创建的细节,又对性能是大大的提高。
代码展示
简历类:
class Resume:ICloneable //简历类
{
private string name;
private string sex;
private string age;
private string timeArea;
private string company;
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 ();
}
}
客户端代码:
class Program
{
static void Main(string[] args)
{
Resume a = new Resume("刘木同");
a.SetPersonalInfo("男", "22");
a.SetWorkExperience("2015-2018","廊坊师范");
//这里只需要调用clone方法就可以实现新简历的生成,并且可以再修改新简历的细节。
Resume b = (Resume)a.Clone();
b.SetWorkExperience("2018-2019","大米时代");
Resume c = (Resume)a.Clone();
c.SetPersonalInfo("女","22");
a.Display();
b.Display();
c.Display();
Console.Read();
}
}
效果展示:
深浅复制
以上写的简历里面有一个“设置工作经历”的方法,可以将它写到一个工作经历类,简历类直接调用即可。由这个来学习一下什么是深浅复制。
浅复制
what:
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
但是实用浅复制, 这个时候满足不了我们的需求,因为一个人的工作经历不可能写三个都是相同的,肯定是不同时间不同地点,所以这时候便出现了深复制。下面来看一下深复制是怎样实现的。
效果图:
深复制
what:
把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
代码展示:
工作经历类:
//工作经历类
class WorkExperience : ICloneable//工作经历实现ICloneable接口
{
private string workDate;
public string WorkDate
{
get { return workDate; }
set { workDate = value; }
}
private string company;
public string Company
{
get { return company; }
set { company = value; }
}
public Object Clone() //工作经历类实现克隆方法
{
return (Object)this.MemberwiseClone();
}
}
简历类:
class Resume:ICloneable //简历类
{
private string name;
private string sex;
private string age;
private WorkExperience work;//引用工作经历
public Resume(string name)
{
this.name = name;
work = new WorkExperience();//在“简历”类实例化时同时实例化“工作经历”
}
//提供clone方法调用的私有构造函数,以便克隆工作经历的数据
private Resume(WorkExperience work)
{
this.work = (WorkExperience)work.Clone();
}
//设置个人信息
public void SetPersonalInfo(string sex,string age)
{
this.sex = sex;
this .age = age;
}
//设置工作经历
public void SetWorkExperience (string workDate,string company)
{
work.WorkDate = workDate;
work.Company = company; //调用此方法时,给对象的两属性赋值。
}
//显示信息
public void Display()
{
Console.WriteLine ("{0}{1}{2}",name,sex,age);
Console.WriteLine("工作经历:{0}{1}",work.WorkDate ,work.Company );//实现接口的方法,用来克隆对象。
}
//调用私有的构造方法,让“工作经历”克隆完成,然后再给这个“简历”对象的相关字段赋值,最终返回一个深复制的简历对象。
public Object Clone()
{
//return (Object)this.MemberwiseClone();
Resume obj = new Resume(this.work);
obj.name = this.name;
obj.sex = this.sex;
obj.age = this.age;
return obj;
}
}
客户端代码:
class Program
{
static void Main(string[] args)
{
Resume a = new Resume("刘木同");
a.SetPersonalInfo("男", "22");
a.SetWorkExperience("2015-2018","廊坊师范");
Resume b = (Resume)a.Clone();
b.SetWorkExperience("2018-2019","大米时代");
Resume c = (Resume)a.Clone();
c.SetPersonalInfo("男","23");
c.SetWorkExperience("2018-2019","阿里巴巴");//添加工作经历---只有这里发生了改变,其他代码相同
a.Display();
b.Display();
c.Display();
Console.Read();
}
}
效果图:
后记
原来浅复制和深复制这么好理解,不过相信以后还会深入学习的!博客是越写越顺手,加油,写到足够将开始的博客顶替掉!