原型模式深复制浅复制

来源:互联网 发布:2016年汽车销售数据 编辑:程序博客网 时间:2024/06/05 18:53


定义:所谓原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
在原型模式中,所发动创建的对象通过请求原型对象来拷贝原型对象自己来实现创建过程,当然所发动创建的对象需要知道原型对象的类型。这里也就是说所发动创建的对象只需要知道原型对象的类型就可以获得更多的原型实例对象,至于这些原型对象时如何创建的根本不需要关心。

      讲到原型模式了,我们就不得不区分两个概念:深拷贝、浅拷贝。

      浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。

     深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值
  优点:
   1、如果创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率。

      2、可以使用深克隆保持对象的状态。

      3、原型模式提供了简化的创建结构。
 缺点:
 1、在实现深克隆的时候可能需要比较复杂的代码。

    2、需要为每一个类配备一个克隆方法,而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事,必须修改其源代码,违背了“开闭原则”。

//原型模式浅复制,浅复制,被复制对象的所有变量都会含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
MemberwiseClone()方法是这样的,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型的,则复制引用但是不复制引用的对象,因此原始对象与其副本引用同一对象。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Configuration;
namespace yjzcjing
{
    class WorkExperience
    {
        private string workDate;
        public string WorkDate
        {
            get { return workDate;}
            set { workDate = value; }
        }
        private string company;
        public string Company
        {
            get { return company; }
            set { company = value; }
        }
    }
    class Rename:ICloneable//继承克隆接口
    {
        private string name;
        private string sex;
        private string age;
        private WorkExperience work;
        public Rename(string name)
        {
            this.name = name;
            work = new WorkExperience();
        }
        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();
        }
    }
  
    class Program
    {
        static void Main(string[] args)
        {
            Rename a = new Rename("小菜");
            a.SetPersonalInfo("男", "29");
            a.SetWorkExperience("1234","xx");
            Rename b = (Rename)a.Clone();
            b.SetWorkExperience("45436", "dfg");
            a.Display();
            b.Display();
            Console.Read();
        }
    }
}
//原型模式深复制


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Configuration;
namespace yjzcjing
{
    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();
        }
    }
    class Rename:ICloneable
    {
        private string name;
        private string sex;
        private string age;
        private WorkExperience work;
        public Rename(string name)
        {
            this.name = name;
            work = new WorkExperience();
        }
        private Rename(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()//该克隆方法,new Rename(this.work)调用的是Rename的私有构造函数,work进行克隆,然后返回对象给obj
        {
            Rename obj = new Rename(this.work);
            obj.name = this.name;
            obj.sex = sex;
            obj.age = age;
            return obj;
        }
    }
  
    class Program
    {
        static void Main(string[] args)
        {
            Rename a = new Rename("小菜");
            a.SetPersonalInfo("男", "29");
            a.SetWorkExperience("1234","xx");
            Rename b = (Rename)a.Clone();
            b.SetWorkExperience("45436", "dfg");
            a.Display();
            b.Display();
            Console.Read();
        }
    }
}





0 0
原创粉丝点击