原型模式 -- 大话设计模式
在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
在初始化的信息不发生变化的情况下,克隆是最好的方法。这既隐藏了对象的创建细节,又对性能有大大的提高(减少实例化等阶段的时间消耗)
1.复印简历(浅复制Clone:如果原对象的属性是值类型,则完整复制;如果原对象的属性是引用类型,则只复制引用,两个引用使用同一对象)
定义简历类,继承ICloneable接口
public class Resume : ICloneable { public string Name { get; set; } public string Sex { get; set; } public string Age { get; set; } public string WorkTime { get; set; } public string Company { get; set; } public Resume(string name) { this.Name = name; } public void SetPersonalInfo(string sex, string age) { this.Sex = sex; this.Age = age; } public void SetWorkExperience(string workTime, string company) { this.WorkTime = workTime; this.Company = company; } public void Display() { Console.WriteLine("{0} {1} {2}", this.Name, this.Sex, this.Age); Console.WriteLine("工作经历:{0} {1}", this.WorkTime, this.Company); } public object Clone() { return this.MemberwiseClone(); } }
开启场景模拟
static void Main(string[] args) { Resume lixiaoyao = new Resume("李逍遥"); lixiaoyao.SetPersonalInfo("男", "23岁"); lixiaoyao.SetWorkExperience("2010年", "仙剑奇侠传第一部"); lixiaoyao.Display(); Resume lixiaoyao2 = (Resume)lixiaoyao.Clone(); lixiaoyao2.SetWorkExperience("2012年", "仙剑奇侠传第三部"); lixiaoyao2.Display(); }
2.复印简历(深复制Clone,Resume必须提供Clone方法调用的私有构造函数,让教育经历和工作经历完成克隆,并对相关字段赋值)
1.定义简历类,继承IConeable接口
public class Resume : ICloneable { public string Name { get; set; } public string Sex { get; set; } public string Age { get; set; } public WorkExperience WorkExperience { get; set; } public EduExperience EduExperience { get; set; } public Resume(string name) { this.Name = name; WorkExperience = new WorkExperience(); EduExperience = new EduExperience(); } /// <summary> /// 提供Clone方法调用的私有构造函数 /// </summary> private Resume(WorkExperience work, EduExperience edu) { this.WorkExperience = (WorkExperience)work.Clone(); this.EduExperience = (EduExperience)edu.Clone(); } public void SetPersonalInfo(string sex, string age) { this.Sex = sex; this.Age = age; } public void SetWorkExperience(string workTime, string company) { this.WorkExperience.WorkTime = workTime; this.WorkExperience.Company = company; } public void SetEduExperience(string studyTime, string school) { this.EduExperience.StudyTime = studyTime; this.EduExperience.School = school; } public void Display() { Console.WriteLine("{0} {1} {2}", this.Name, this.Sex, this.Age); Console.WriteLine("教育经历:{0} {1}", this.EduExperience.StudyTime, this.EduExperience.School); Console.WriteLine("工作经历:{0} {1}", this.WorkExperience.WorkTime, this.WorkExperience.Company); } public object Clone() { //调用私有构造函数,让工作经历和教育经历完成克隆,并给相关字段赋值 Resume obj = new Resume(this.WorkExperience, this.EduExperience); obj.Name = this.Name; obj.Sex = this.Sex; obj.Age = this.Age; return obj; } } public class WorkExperience : ICloneable { public string WorkTime { get; set; } public string Company { get; set; } public object Clone() { return this.MemberwiseClone(); } } public class EduExperience : ICloneable { public string StudyTime { get; set; } public string School { get; set; } public object Clone() { return this.MemberwiseClone(); } }
开启场景模拟
static void Main(string[] args) { Resume lixiaoyao = new Resume("李逍遥"); lixiaoyao.SetPersonalInfo("男", "23岁"); lixiaoyao.SetEduExperience("2006年", "石家庄铁道大学"); lixiaoyao.SetWorkExperience("2010年", "仙剑奇侠传第一部"); Resume lixiaoyao2 = (Resume)lixiaoyao.Clone(); lixiaoyao2.SetEduExperience("2010年", "北京喜剧学院"); lixiaoyao2.SetWorkExperience("2012年", "仙剑奇侠传第三部"); lixiaoyao.Display(); lixiaoyao2.Display(); }