读书人

狂言设计模式之原型模式中的复制

发布时间: 2013-03-10 09:38:39 作者: rapoo

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

在软件中,创建一个对象需要花费不少时间,远没有选中,然后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();        }    }

运行结果:

狂言设计模式之原型模式中的复制



读书人网 >软件开发

热点推荐