zoukankan      html  css  js  c++  java
  • 【大话设计模式读书笔记——原型模式】

    原型模式

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

        /// <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公司
    
  • 相关阅读:
    帝国 标签模板 使用程序代码 去除html标记 并 截取字符串
    iis6 伪静态 iis配置方法 【图解】
    您来自的链接不存在 帝国CMS
    帝国cms Warning: Cannot modify header information headers already sent by...错误【解决方法】
    .fr域名注册 51元注册.fr域名
    帝国网站管理系统 恢复栏目目录 建立目录不成功!请检查目录权限 Godaddy Windows 主机
    星外虚拟主机管理平台 开通数据库 出现Microsoft OLE DB Provider for SQL Server 错误 '8004' 从字符串向 datetime 转换失败
    ASP.NET 自定义控件学习研究
    CSS层叠样式表之CSS解析机制的优先级
    ASP.NET程序员工作面试网络收藏夹
  • 原文地址:https://www.cnblogs.com/q975261413/p/8168081.html
Copyright © 2011-2022 走看看