原型模式


原型模式:

    用原型实例要创建的对象的种类可定制),并且通过拷贝这些原型来创建新的对象(不需要知道创建的细节)——提高性能,动态获得对象运行时的状态。

    .NET在System命名空间中提供了ICloneable接口,唯一的方法Clone()克隆,因此只要实现该接口就可以完成原型模式,所以原型抽象类Prototype是不需要的。

结构图:

原型模式_第1张图片

进一步探究这里还涉及到了深、浅复制的问题;

   浅复制

      是指被复制对象的所有变量都含有与原来的对象相同的值,简单一点说就是赋值,而所有的对其他对象的引用(传引用和传值DF的链接)都仍然指向原来的对象,只是复制了引用,这样容易出现问题:如有B浅复制了A的引用,如果A修改了资源,B处则会报错;

   深复制

       是把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。就是说深复制不仅复制了引用而且还复制了引用的对象,使得对象拥有了不同的资源(相同内容不同名字的新资源)对于堆资源来说,就是开辟了一块堆内存,把原有内容拷贝。这在下面的代码中也有体现。

代码实例:

    class Resum : ICloneable
    {
        private string name;
        private string sex;
        private string age;
        private WorkEeprience work;//引用“工作经历”对象
        public Resum(string name)
        {
            this.name = name;
            work = new WorkEeprience();//实例化简历时实例化工作经历
        }
        //私有构造函数,克隆工作经历数据
        private Resum(WorkEeprience work)
        {
            this.work = (WorkEeprience)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);
            //实现接口IClone方法,克隆对象
            Console.WriteLine("工作经历:{0}{1}", work.WorkDate, work.Company);
        }
        public object Clone()
        {
            //调用私有构造方法,让“工作经历”克隆完成
            Resum obj = new Resum(this.work);
            obj.name = this.name;
            obj.sex = this.sex;
            obj.age = this.age;
            return obj;
        }
    }


ACTION   IS   THE   REAL   MEASURE  OF   INTELLIGENCE  .   THANKS   FOR   YOUR   TIME!

你可能感兴趣的:(C#,原型模式,深复制,浅复制)