设计模式之原型模式

    原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。换句话说,原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。

    原型模式最大的特点是克隆一个现有的对象,一般是由对象的内部提供克隆方法。

    原型模式的结构图:

    基本的原型模式的代码:

 //原型类
    abstract class Prototype
    {
        private string id;
        public Prototype(string id)
        {
            this.id = id;
        }
        public string Id
        {
            get { return id; }
        }

    }
    //具体原型类
    class ConcretePrototype1 : Prototype
    {
        public ConcretePrototype1(string id)
            : base(id)
        {
        }
        public override Prototype Clone()
        {
            return (Prototype)this.MemberwiseClone();
        }
    }
	//客户端代码 
	static void Main(string[] AssemblyLoadEventArgs) 
	{
	    ConcretePrototype1 p1=new ConcretePrototype("I");  
      	    ConcretePrototype1 c1=(ConcretePrototype)p1.Clone();  
      	    Console.WriteLine("Cloned:{0}",c1 .Id );  
      	    Console.Read();  
	}


 

 

    例子:要求有一个简历类,必须要有姓名,可以设置性别和年龄,可以设置工作经历。最终需要三份简历。

    结构图:

 

    代码:

//原型模式,简历类
    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();
        }
    }	
	//客户端代码	
    static void Main(string[] args)
        {
            Resume a = new Resume("大鸟");
            a.SetPersonalInfo("男","29");
            a.SetWorkExperience("1998-2000","XX公司"); 
            Resume b = (Resume)a.Clone();

            b.SetWorkExperience("1998-2006", "YY公司");            
            Resume c = (Resume)a.Clone();
            c.SetPersonalInfo("男", "24");
            a.Display();
            b.Display();
            c.Display();                                        
            Console.Read();
	}


 

 

结果显示:

大鸟  男  29

工作经历  1998-2000 XX公司

大鸟 男 29

工作经历 1998-2006 YY公司

大鸟 男 24

工作经历 1998-2000 XX公司    

    深复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。

    浅复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

    举个例子区分一下,现在,“简历”类中有个设置工作经历的方法,一般会再有一个工作经历类,当中有时间区间和公司名称等属性,简历类直接调用这个对象即可。

    结构图:

 

    浅复制代码:

//浅复制

    //工作经历类
    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 Resume : ICloneable
    {
        private string name;
        private string sex;
        private string age;

        private WorkExperience work;

        public Resume(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();
                    }
    }
     //客户端代码
    static void Main(string[] args)
        {
            Resume a = new Resume("大鸟");
            a.SetPersonalInfo("男","29");
            a.SetWorkExperience("1998-2000","XX公司");                                                                          		   
            Resume b = (Resume)a.Clone();
            b.SetWorkExperience("1998-2006", "YY公司");                                                                         		   
            Resume c = (Resume)a.Clone();
            c.SetPersonalInfo("男", "24");
            c.SetWorkExperience("1998-2003","zz企业");                                                                       	   	   
            a.Display();
            b.Display();
            c.Display(); 
            Console.Read();
}


 

 

    结果显示:

大鸟 男 29

工作经历 1998-2003 ZZ企业

大鸟 男 29

工作经历 1998-2003 ZZ企业

大鸟 男 24

工作经历 1998-2003 ZZ企业

 

    深复制代码:

//工作经历类
    //深复制
    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 Resume : ICloneable
    {
        private string name;
        private string sex;
        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 ;
        }
    }


    客户端代码一样,但是结果:

大鸟 男 29

工作经历 1998-2000 XX公司

大鸟 男 29

工作经历 1998-2006 YY公司

大鸟 男 24

工作经历 1998-2003 ZZ企业   

    浅复制和深复制的结果显然不一样,就是因为,浅复制复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象,这里三次的结果都是最后一次设置的值。而深复制将引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。 

 

 

 

 

 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值