【大话设计模式读书笔记——原型模式】

原型模式

原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。
原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。

    /// <summary>
    /// 简历类
    /// </summary>
    public class Resume : ICloneable
    {
        private string name;
        private string sex;
        private int age;
        private WorkExperience workExperience;
        public Resume(string name)
        {
            this.name = name;
            workExperience = new WorkExperience();
        }
        private Resume(WorkExperience workExperience)
        {
            this.workExperience = (WorkExperience)workExperience.Clone();
        }
        /// <summary>
        /// 设置个人信息
        /// </summary>
        /// <param name="sex"></param>
        /// <param name="age"></param>
        public void SetPersonInfo(string sex,int age)
        {
            this.sex = sex;
            this.age = age;
        }
        /// <summary>
        /// 设置工作经验
        /// </summary>
        /// <param name="workDate"></param>
        /// <param name="company"></param>
        public void SetWorkExperience(string workDate, string company)
        {
            workExperience.WorkDate = workDate;
            workExperience.Company = company;
        }

        /// <summary>
        /// 显示
        /// </summary>
        public void Display()
        {
            Console.WriteLine("{0} {1} {2}",name,sex,age);
            Console.WriteLine("工作经历 {0} {1}", workExperience.WorkDate, workExperience.Company);
        }
        /// <summary>
        /// 一般在初始化信息不可发生变化的情况下,克隆是最好的办法。这即隐藏了对象创建的细节,又对性能是大大的提高。
        /// </summary>
        /// <returns></returns>
        public object Clone()
        {
            //MemberwiseClone:返回当前对象的浅表副本(它是Object对象的基方法)
           // return this.MemberwiseClone();//浅度复制:如果字段是值类型的,则对字段执行逐位的复制。如果字段是引用类型,则复制引用但不复制对象。因此,原始对象及其副本对象为同一对象。

            Resume obj = new Resume(workExperience);
            obj.name = name;
            obj.age = age;
            obj.sex = sex;
            return obj;
        }
    }

    /// <summary>
    /// 工作经历
    /// </summary>
    public class WorkExperience: ICloneable
    {
        public string WorkDate { get; set; }
        public string Company { get; set; }

        public object Clone()
        {
            return this.MemberwiseClone();// 浅拷贝
        }
    }
 //浅复制:被复制的对象所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象
            //深复制:把引用对象的变量指向复制过的新对象,而不是原来的被引用对象。

            Resume b = (Resume)a.Clone();
            b.SetPersonInfo("男", 30);
            b.SetWorkExperience("1998-20001", "BBB公司");
           

            Resume c = (Resume)a.Clone();
            c.SetPersonInfo("男", 31);
            c.SetWorkExperience("1998-20002", "CCC公司");

            a.Display();
            b.Display();
            c.Display();
输出:
大鸟 男 29
工作经历 1998-2000 AAA公司
大鸟 男 30
工作经历 1998-20001 BBB公司
大鸟 男 31
工作经历 1998-20002 CCC公司
posted @ 2018-01-01 17:55  the boy、图样图森破  阅读(166)  评论(0编辑  收藏  举报