您的位置:首页 > 其它

大话设计模式之原型模式中的复制

2013-03-06 15:46 295 查看
       在软件中,创建一个对象需要花费不少时间,远没有选中,然后Ctrl C与Ctrl V来的快,通过这两个快捷键,就产生了你想要的一模一样的东东,虽然东东一样,但是内存地却不一样,这就跟设计模式中的原型模式差不多,我个人觉得,Ctrl C与Ctrl V就是原型模式的最好应用。

原型模式:

概念:

       用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建细节。

结构图:    

                         


     总结了一下,觉得设计模式中的原型模式,提供了两种复制方式,第一种是浅复制,第二种是深复制,都是复制,但效果却和直接复制不一样。   

直接复制:

        所谓的直接复制,就是借用“=”,将需要复制的内容传给对方,这种方法在传递过程中,传的其实是引用,而不是值,它并没有什么实际内容。      

static void Main(string[] args)
{
Resume a = new Resume("赵栗婧");
a.SetPersonalInfo("女", "20");
a.SetWorkExperience("2", "xx公司");
Resume b = a;
Resume c = a;
a.DisPlay();
b.DisPlay();
c.DisPlay();
}
}
class Resume
{
private string name;
private string sex;
private string age;
private string timeArea;
private string company;
public Resume(string name)
{
this.name = name;
}
public void SetWorkExperience(string timeArea, string company)
{
this.timeArea = timeArea;
this.company = company;
}
public void SetPersonalInfo(string sex, string age)
{
this.age = age;
this.sex = sex;
}
public void DisPlay()
{
Console.WriteLine("{0}{1}{2}", name, sex, age);
Console.WriteLine("{0}{1}", timeArea, company);
}
}

运行结果:

            


浅复制:

      在,NET中,System命名空间中提供了ICloneable接口,所以只要实现这个接口,就可以实现浅复制和深复制,完成原型模式了,所以,由于复制经常使用,.NET提供了这个接口,所以就用不着Prototype这个原型模式中的抽象类了。 

static void Main(string[] args)
{
Resume a = new Resume("赵栗婧");
a.SetPersonalInfo("男", "20");
a.SetWorkExperience("2,", "xx公司");
a.DisPlay();

Resume b = (Resume)a.Clone();   //调用Clone,实现简历生成
b.SetPersonalInfo("女", "24");
b.DisPlay();

Resume c = (Resume)b.Clone();
c.SetWorkExperience("3,", "YY企业");
c.DisPlay();
}
}
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 SetWorkExperience(string timeArea, string company)
{
this.timeArea = timeArea;
this.company = company;
}
public void SetPersonalInfo(string sex, string age)
{
this.age = age;
this.sex = sex;
}
public void DisPlay()
{
Console.WriteLine("{0}{1}{2}", name, sex, age);
Console.WriteLine("{0}{1}", timeArea, company);
}
public object Clone()
{
return (object)this.MemberwiseClone ();
}
}

运行结果:

         


深复制:

       浅复制中运用的MemberwiseClone()方法中,如果字段是值类型,那么此方法就对字段进行逐位复制,如果是引用类型,这只复制引用不复制引用的对象,也就是说一旦类当中有对象引用,那么引用的对象的数据时不会被复制下来。要想复制下来,就要使用深复制。     

static void Main(string[] args)
{
Resume a = new Resume("张磊磊");
a.SetWorkExperience("3,", "zz企业");
a.SetPersonalInfo("女", "23");
Resume b = (Resume)a.Clone();
b.SetWorkExperience("2,", "yy公司");
Resume c = (Resume)a.Clone();
c.SetPersonalInfo("男", "23");
a.DisPlay();
b.DisPlay();
c.DisPlay();
}
}
//简历
class Resume : ICloneable
{
private string sex;
private string name;
private string age;
private WorkExperience work;
public Resume(string name)      //名字
{
this.name = name;
work=new WorkExperience() ;
}
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()
{
Resume obj = new Resume(this.work);
obj.name = this.name;
obj.sex = this.sex;
obj.age = this.age;
return obj;
}
}
//工作经历
class WorkExperience : 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();
}
}

运行结果:

          


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: