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

本文介绍了设计模式中的原型模式,探讨了其应用场景,并通过浅复制与深复制两种方式实现了对象的克隆,展示了如何在.NET中利用ICloneable接口来实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

运行结果:

          


 


 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值