C#设计模式之原型模式

前言

书上这个代码不少,改动的地方比较多把,而且还介绍了一个深浅复制,让我们进一步去看看是怎样一步一步学到深复制的?原型模式有是怎样的呢?

原型模式

英文: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();
        }
    }

效果图:

深复制

后记

原来浅复制和深复制这么好理解,不过相信以后还会深入学习的!博客是越写越顺手,加油,写到足够将开始的博客顶替掉!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值