设计模式学习笔记-原型模式
<div id="cnblogs_post_body">1. 概述通过复制一个已经存在的实例来创建一个新的实例。被复制的实例被称为原型,这个原型是可定制的。
2. 模式中的角色
2.1 抽象原型类(Abstract Prototype):提供一个克隆接口
2.2 具体原型类(Concrete Prototype): 及实现了克隆接口的具体原型类
3. 实例:求职网站上现在都支持多份简历,如果每创建一份简历都要从头至尾地填写一遍,那也是非常让人沮丧的事。其实针对我们的求职岗位的不同,不同的简历可能只要修改局部内容就可以了,而不用全部重新构建一份新的简历。复制一份简历,然后做局部修改是最让人省心的了!
3.1 实现类图
http://pic002.cnblogs.com/images/2012/155937/2012062812204256.png
类图解读
在.NET中,System命名空间已经为我们提供了一个ICloneable接口,它包含了一个方法Clone(),实现这个接口就完成了原型模式。
3.2 在写实现代码之前,先要理解一下深复制与浅复制。
3.2.1 浅复制:将原来对象中的所有字段逐个复制到一个新对象,如果字段是值类型,则简单地复制一个副本到新对象,改变新对象的值类型字段不会影响原对象;如果字段是引用类型,则复制的是引用,改变目标对象中引用类型字段的值将会影响原对象。例如, 如果一个对象有一个指向引用类型(如例子中的工作经历)的字段, 并且我们对该对象做了一个浅复制, 那麽两个对象将引用同一个引用(即同一段工作经历)。
3.2.2 深复制:与浅复制不同之处在于对引用类型的处理,深复制将新对象中引用类型字段指向复制过的新对象,改变新对象中引用的任何对象,不会影响到原来的对象中对应字段的内容。例如,如果一个对象有一个指向引用类型(如例子中的工作经历)的字段,并且对该对象做了一个深复制的话.我门将创建一个新的对象(即新的工作经历)。
3.3 简历的浅复制实现
<div class="cnblogs_code"> /// <summary> /// 实现了ICloneable接口的简历类 /// </summary> public class Resume:ICloneable { public Resume() { mWorkExperience = new WorkExperience(); } private string mName; private string mSex; private int mAge; private WorkExperience mWorkExperience; public string Name { get { return mName; } set { mName = value; } } public string Sex { get { return mSex; } set { mSex = value; } } public int Age { get { return mAge; } set { mAge = value; } } /// <summary> /// 关联了一个引用类型 /// </summary> public WorkExperience WorkExperience { get { return mWorkExperience; } } public void SetWorkExperience(DateTime startDate, DateTime endDate, string company, string position) { this.mWorkExperience.Company = company; this.mWorkExperience.EndDate = endDate; this.mWorkExperience.StartDate = startDate; this.mWorkExperience.Position = position; } /// <summary> /// 实现ICloneable接口的Clone方法 /// </summary> /// <returns></returns> public object Clone() { // .Net 为我们提供的浅复制对象的方法 return this.MemberwiseClone(); } } /// <summary> /// 工作经历类 /// </summary> public class WorkExperience { public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public string Company { get; set; } public string Position { get; set; } }
页:
[1]