在设计模式中介绍了原型模式,对原型模式的定义是这样的:用原型实例指定创建对象的种类,并且通过拷
贝这些原型创建新的对象;说白了就是创建好一个模版然后‘复制’即可
话说回来,以前只知道复制,但是还不知道复制还分深浅呢,下面来讲一下浅复制与深复制
一、提出问题
当简历类中的字段都是值的时候可以直接复制就行,那么当字段是引用的时候直接复制还可以吗?
注:引用是类中的方法实现调用另一个类中的数据或方法
经过小菜的实践得知,当字段为引用时不能对原数据进行复制(这就是浅复制)
代码如下:
class WorkExperience:ICloneable
{
private string workdate;
public string WorkDate
{
set { workdate = value; }
get { return workdate; }
}
private string company;
public string Company
{
set { company = value; }
get { return company; }
}
}
class Resume :ICloneable
{
private string name;
private string sex;
private string age;
//建立work,引用‘工作经历’
private WorkExperience work;
public Resume(string name)
{
this.name = name;
work =new WorkExperience ();
}
public void SetExperience(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();
}
}
<pre name="code" class="csharp">class Program
{
static void Main(string[] args)
{
Resume a = new Resume("大鸟");
a.SetExperience("男", "22");
a.SetWorkExperience("2012-2014", "XX公司");
Resume b = (Resume)a.Clone();
//b.SetExperience("女", "21");
b.SetWorkExperience("2013-2014", "YY公司");
a.DisPlay();
b.DisPlay();
Console.Read();
}
}
分析:主程序把数据赋值给引用,引用会随着数据的变化而变化,直到最后一次的设置,在简历类中仅仅
是对引用进行克隆,所以在最终两条结果都显示为最后一次设置
那么我们该如何做到深复制呢?
二、解决方法
要做到深复制,那就要直接复制工作经历中的数据,即在工作经历类中实现克隆方法,并且在简历类中调
用以便克隆数据,这样就可以把原数据和引用全都复制,做到了深复制
这样就可实现深复制
三、比较
浅复制:因为浅复制只是复制的引用,引用是指向特定的对象的,那么原模型和复制后的对象就有了联系
在改变原模型后引用也会发生变化。
深复制:它不仅复制了引用而且还有对象本身,这样就可以做到复制后的对象不随原数据的变化而变化。
四、总结
利用原型模式可以很好的简化代码,优化代码,减少内存的负担
做好学习的总结很重要,也许你在看的时候有一些不明白的,但是在做总结的过程中通过查资料,会越来
越明白。。