原型模式
来源:互联网 发布:阿里云计算技术架构 编辑:程序博客网 时间:2024/05/10 00:58
原型模式也属于构建型设计模式,不多说了直接开始总结
原型模式
定义
(Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
UML结构图
客户(Client)角色:调用原型对象的客户程序
抽象原型(Prototype)角色:规定了具体原型对象必须实现的接口
具体原型(ConcretePrototype):从抽象原型派生而来,是客户程序使用的对象,即被复制的对象。此角色需要实现抽象原型角色所要求的接口。
具体实例
- 1.简历类需要实现ICloneable接口,这个接口是命名空间提供的,他唯一的方法就是Clone()
- 2.简历类中有设置个人信息,工作经历,显示和clone的方法
- 3.克隆的目的,不是在于复制完全一样的内容,而是在于同类型的对象不用在重新实例化,就能创建出一个类型相同内容不同的对象,下边的例子,对象a,new了一次,之后b和c不用重新构造函数,就能创造出和a格式相同,但是工作经验不同的例子,提高了性能
class Resume:ICloneable //提供的ICloneable接口,其中唯一的方法就是clone { private string name; private string sex; private string age; private string timeArea; private string company; public Resume(string name) { this.name = name; } //个人信息 public void SetPersonalInfo(string sex,string age) { this.sex = sex; this.age = age; } //工作经验 public void SetWorkExperience(string timeArea,string company) { this.timeArea = timeArea; this.company = company; } //显示 public void Display() { Console.WriteLine("{0} {1} {2}", name, sex, age); Console.WriteLine("工作经验:{0} {1}", timeArea, company);//实现接口的方法用来实现对象 } public object Clone() { return (object)this.MemberwiseClone();//对于实例化对象进行克隆,具体实现接口的方法 }
客户端:
static void Main(string[] args) { Resume a = new Resume("李子明"); //实例化一次对象,之后不用再NEW,就可以复制出一样的对象副本 a.SetPersonalInfo("男", "28"); a.SetWorkExperience("2008-2010", "X企业"); Resume b = (Resume)a.Clone(); b.SetWorkExperience("2010-2013", "Y企业"); Resume c = (Resume)a.Clone(); c.SetWorkExperience("2013-2015", "z企业"); a.Display(); b.Display(); c.Display();
优点和使用场景
- 优点:使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,通常对克隆所产生的对象进行修改对原型对象不会造成任何影响,每一个克隆对象都是相互独立的。通过不同的方式修改可以得到一系列相似但不完全相同的对象。(来自网络)
- 使用场景:在需要重复地创建相似对象时可以考虑使用原型模式。在初始化的信息不发生变化的情况下,克隆是最好的办法。既隐藏了对象的创建细节,又对性能是大大的提高。
浅复制和深复制
- 浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然只想原来的对象
- 深复制:把引用对象的变量指向复制过得新对象,而不是原有的被引用的对象。
自己的理解:数据类型分为值类型和引用类型,而深浅复制的区别就在于是否能够复制引用类型的成员变量,浅复制对于值类型没有问题,但是对于引用类型,就只是复制了原型引用类型的地址,原型和克隆对象的地址是相同的,引用还是指向了原来的对象
总结
今天总结的这个模式实现起来并不难,无非就是实现一个接口,重写一个方法,但是难就在与如何应用好这个模式,希望在以后实践中多多摸索
1 0
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型 模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 《TCP/IP高效编程》笔记
- iOS UIcollectionView 和 UITableView 限制item 或cell的交换方法
- 两棵树的命运
- QA Sign off template
- ORA-01034: ORACLE not available如何解决
- 原型模式
- 【UML】-九种图之构件图
- Kafka消息delivery可靠性保证(Message Delivery Semantics)
- Android M 部分API变动研究
- 按格式输出 用到 js中的nextUntil
- JSON 隐藏的特殊用法
- java操作pdf文件
- Xcode 添加 SVN 出现 nsurlerrordomain error 1012
- poj2253 用dijkstra计算最短路径的两个结点的最短长度