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


    原型模式

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

        /// <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公司
    
  • 相关阅读:
    sql server 去掉重复项
    mvc2.0与3.0 便利一行三个元素 便利多行代码
    新距离
    Android
    Java
    计算机文化基础期末考试复习
    立体的导航条
    腾讯微博
    1637
    私有变量
  • 原文地址:https://www.cnblogs.com/q975261413/p/8168081.html
Copyright © 2020-2023  润新知