版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Design Patterns原型模式刘 伟 (Sunny)大纲原型模式概述原型模式的结构与实现原型模式的应用实例原型管理器原型模式的优缺点与适用环境2原型模式概述孙悟空“拔毛变小猴”3原型模式概述分析孙悟空:根据自己的形状复制(克隆)出多个身外身软件开发:通过复制一个原型对象得到多个与原型对象一模一样的新对象原型模式4原型模式概述原型模式的定义对象创建型模式原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。Prototype Pattern: Specify the kinds of objects to create using a prototypical
2、instance, and create new objects by copying this prototype.5原型模式概述原型模式的定义工作原理:将一个原型对象传给要发动创建的对象(即客户端对象),这个要发动创建的对象通过请求原型对象复制自己来实现创建过程创建新对象(也称为克隆对象)的工厂就是原型类自身,工厂方法由负责复制原型对象的克隆方法来实现通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,每一个克隆对象都是独立的通过不同的方式对克隆对象进行修改以后,可以得到一系列相似但不完全相同的对象6原型模式的结构与实现原型模式的结构7原型模式的结构与实现原型模式的结构原型模式
3、包含以下3个角色:Prototype(抽象原型类)ConcretePrototype(具体原型类)Client(客户类)8原型模式的结构与实现浅克隆与深克隆浅克隆(Shallow Clone):当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制9原型模式的结构与实现浅克隆与深克隆深克隆(Deep Clone):除了对象本身被复制外,对象所包含的所有成员变量也将被复制10原型模式的结构与实现原型模式的实现通用的克隆实现方法abstract class Prototype public abstract Prototype Clone();class Co
4、ncretePrototype : Prototype private string attr; /成员变量 public string Attr get return attr; set attr = value; /克隆方法 public override Prototype Clone() ConcretePrototype prototype = new ConcretePrototype(); prototype.Attr = attr; return prototype; ConcretePrototype prototype = new ConcretePrototype();C
5、oncretePrototype copy = (ConcretePrototype)prototype.Clone();11原型模式的结构与实现原型模式的实现C#中的MemberwiseClone()方法和ICloneable接口在C#语言中,提供了一个MemberwiseClone()方法用于实现浅克隆,该方法使用起来很方便,直接调用一个已有对象的MemberwiseClone()方法即可实现克隆/成员类class Memberclass ConcretePrototypeAprivate Member member; /成员对象public Member Memberget return
6、 member; set member = value; /克隆方法public ConcretePrototypeA Clone()return (ConcretePrototypeA)this.MemberwiseClone(); /浅克隆ConcretePrototypeA prototype, copy;prototype = new ConcretePrototypeA();copy = prototype.Clone();Console.WriteLine(prototype = copy);Console.WriteLine(prototype.Member = copy.Mem
7、ber);FalseTrue12原型模式的结构与实现原型模式的实现C#中的MemberwiseClone()方法和ICloneable接口在C#语言中还提供了一个ICloneable接口,它也可以用来创建当前对象的副本ICloneable接口充当了抽象原型类的角色,具体原型类通常作为实现该接口的子类public interface ICloneable object Clone();class ConcretePrototypeB : ICloneable /实现ICloneable接口private Member member;public Member Memberget return m
8、ember; set member = value; /实现深克隆 public object Clone() ConcretePrototypeB copy = (ConcretePrototypeB)this.MemberwiseClone(); Member newMember = new Member(); copy.Member = newMember; return copy; ConcretePrototypeB prototype, copy;prototype = new ConcretePrototypeB();copy = (ConcretePrototypeB) pro
9、totype.Clone();Console.WriteLine(prototype = copy);Console.WriteLine(prototype.Member = copy.Member);FalseFalse13原型模式的应用实例实例说明在使用某OA系统时,有些岗位的员工发现他们每周的工作都大同小异,因此在填写工作周报时很多内容都是重复的,为了提高工作周报的创建效率,大家迫切地希望有一种机制能够快速创建相同或者相似的周报,包括创建周报的附件。试使用原型模式对该OA系统中的工作周报创建模块进行改进。14原型模式的应用实例实例类图工作周报创建模块结构图15原型模式的应用实例实例代码(
10、1) WeeklyLog:周报类,充当原型角色(2) Attachment:附件类(3) Program:客户端测试类演示参考代码 (DesignPatternPrototypeSample)16原型模式的应用实例结果及分析周报对象被成功复制,但是附件对象并没有复制,实现了浅克隆周报是否相同?否附件是否相同?是17原型模式的应用实例深克隆解决方案将周报类WeeklyLog和附件类Attachment标记为可序列化(Serializable)Serializableclass WeeklyLog private Attachment attachment;Serializableclass At
11、tachment18原型模式的应用实例深克隆解决方案修改周报类WeeklyLog的Clone()方法/使用序列化方式实现深克隆public WeeklyLog Clone() WeeklyLog clone = null; fs = new (Temp.dat, ); BinaryFormatter formatter = new BinaryFormatter(); try formatter.Serialize(fs, this); /序列化 catch (SerializationException e) Console.WriteLine(Failed to serialize. Re
12、ason: + e.Message); throw; finally fs.Close(); fs1 = new (Temp.dat, ); BinaryFormatter formatter1 = new BinaryFormatter(); try clone = (WeeklyLog)formatter1.Deserialize(fs1); /反序列化 catch (SerializationException e) Console.WriteLine(Failed to deserialize. Reason: + e.Message); throw; finally fs1.Clos
13、e(); return clone;周报是否相同?否附件是否相同?否客户端输出19原型管理器定义原型管理器(Prototype Manager)将多个原型对象存储在一个集合中供客户端使用,它是一个专门负责克隆对象的工厂,其中定义了一个集合用于存储原型对象,如果需要某个原型对象的一个克隆,可以通过复制集合中对应的原型对象来获得20原型管理器结构带原型管理器的原型模式21原型管理器实现using System.Collections;class PrototypeManagerHashtable ht = new Hashtable(); /使用Hashtable存储原型对象 public Pro
14、totypeManager() ht.Add(A, new ConcretePrototypeA(); ht.Add(B, new ConcretePrototypeB(); public void Add(string key, Prototype prototype) ht.Add(key,prototype); public Prototype Get(string key) Prototype clone = null; clone = (Prototype)htkey).Clone(); /通过克隆方法创建新对象 return clone; 22原型模式的优缺点与适用环境模式优点简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率扩展性较好提供了简化的创建结构,原型模式中产品的复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品可以使用深克隆的方式保存对象的状态,以便在需要的时候使用,可辅助实现撤销操作23原型模式的优缺点与适用环境模式缺点需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了开闭原则在实现深克隆时需要编写较为复杂的代码,而且当对象
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人时间管理策略方案预案
- 职工教育训练承诺保证承诺书4篇范文
- 学校教育服务品质保证承诺书8篇
- 创新药研发质量保证承诺书(3篇)
- 交通信号灯操作规程手册
- 创意设计跨界融合承诺书(4篇)
- 交通物流运输管理操作指南
- 环境科学基础理论与实践应用
- 酒店客房卫生服务承诺书范文4篇
- 企业合作项目质量保证承诺书范文7篇
- ISO27001最新版信息风险评估表
- 商铺出租可行性方案
- 写字楼物业各项应急预案
- 基于无人机的公路基础设施健康监测与安全预警系统设计
- 2023年非车险核保考试真题模拟汇编(共396题)
- 市场监管总局直属事业单位招聘考试题库2023
- 高三通用技术专题复习草图设计-转动类连接件
- 2022-2023年明纬开关电源手册
- 家庭伦理思想及性理疗病课堂参考教材-教材讲义
- 劳动教育智慧树知到答案章节测试2023年丽水学院
- 家具(家居)公司专卖店加盟管理手册
评论
0/150
提交评论