设计模式—原型模式

 概念

    原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.原型模式就是从一

个对象再创建另一个可定制的对象,而且不需要任何创建细节。.NETSystem命名空间中提供了ICloneable接口,其

中唯一的方法Clone(),实现这个接口就可以 完成原型模式了。

UML



实战代码             

<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace 原型模式
{
    class Program
    {
        static void Main(string[] args)
        {
            Resume a = new Resume("阿杰");
            a.SetPersonalInfo("男", "23");
            a.SetWorkExperience("2011-2012", "XX公司");

            Resume b = (Resume)a.Clone();                           //调用clone方法实现简历更新,并且可以再修改简历的细节
            b.SetWorkExperience("2012-2013", "YY公司");

            Resume c = (Resume)a.Clone();
            c.SetPersonalInfo("男", "22");

            a.Display();
            b.Display();
            c.Display();

            Console.Read();


        }
    }

    //工作经历
    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;
        }

     }

}
</span>

实战结果


           

浅复制和深复制

    如果字段是值类型,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象,因此原

始对象及其复本引用同一对象。也就是说浅复制只是复制的引用(地址)而不复制值,深复制复制的是值。

深复制的实现

    通过调用私有的构造函数实现深复制。

小结   

   一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。通过原型模式,利用Clone实现了代码和功能的复用,减少了相同功能代码的冗余,提高了代码的质量



评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值