原型模式

【创建型设计模式】原型模式

允我心安 提交于 2019-12-24 04:22:34
文章目录 前言(一些废话,可以忽略) 要解决的问题 浅拷贝原型模式 使用clone的深拷贝 基于序列化的深拷贝 总结 前言(一些废话,可以忽略) 同样是创建型的设计模式,这种模式与工厂模式相比,结构更为简单,也更好理解,直接进入正题 PS .部分类实现见文末 要解决的问题 克隆羊多利大家都知道,原型模式要解决的就是对象的复制问题,在没有原型模式的情况下,我们直接通过复制对象的属性值来获取新的相同对象 /** * 羊 * @program: ade-someproblem * @author: cade franklin * @create: 2019-12-22 22:12 **/ public class Sheep { private String name ; private Integer age ; public Sheep ( String name , Integer age ) { this . name = name ; this . age = age ; } //...toString //...setter //...getter } 在调用的时候直接通过获取对象属性,或设置相同的属性值来进行克隆,显然很原始,一旦原始对象发生变化,我们需要修改克隆使用的地方 /** * @program: ade-someproblem * @author: cade

原型模式

旧街凉风 提交于 2019-12-21 01:09:02
概述 原型模式(Prototype Pattern)是指使用原型实例创建对象的类型,并且通过复制原型创建新的对象,属于创建型模式不属于23中设计模式。说白了就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。原型模式的例子:BeanUtils、JSON.parseObject等 原型模式适用场景: 类初始化消耗大 new对象时需要非常繁琐的过程(数据准备、访问权限等) 构造函数比较复杂 对对象复制和拷贝分为浅复制和深复制下面来介绍 浅复制 完整复制值类型的数据,不复制引用类型的数据。换句话说就是只复制当前对象的值数据,对于内部数组、引用对象不复制,也就是说修改引用对象时,所以复制对象包括原型对象都会被修改。 下面我们实现JDK的Cloneable接口实现克隆 原型实体对象 public class ConcretePrototypeA implements Cloneable{ private String name; private String age; private Date birthday; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return

Java学习笔记之--------原型模式

我们两清 提交于 2019-12-19 07:18:18
原型模式 通过new产生一个对象需要非常繁琐的数据准备或者访问权限,可以使用原型模式。原型模式就是Java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型模式的特点。原型模式的优势:效率高(直接克隆,避免了重新执行构造过程步骤)。 克隆和new类似,但是不同于new。new创建新的对象属性用的是默认值,克隆出的对象的属性值完全和原型对象相同。并且克隆出的新对象改变不会影响原型对象。然后,再修改克隆对象的值。 Prototype模式中实现起来最困难的地方就是内存复制操作,所幸在Java中提供了clone()方法替我们做了绝大一部分事情,这里需要注意的是,clone()方法是Object里面的,但是如果需要克隆类的对象,必须实现Cloneable接口。 原型模式demo 我们模仿克隆羊多利,实现一下羊的克隆,代码如下: public class Sheep implements Cloneable{ private String sname; private Date birthday; @Override protected Object clone() throws CloneNotSupportedException { //直接调用Object对象的clone()方法 Object obj = super.clone(); //添加以下代码实现深复制

原型模式

我的未来我决定 提交于 2019-12-18 18:44:21
前言    原型模式(Prototype), 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。    .NE在System命名空间中提供了ICloneable接口 ,其中就是唯一的一个方法 Clone() ,这样只需要实现这个接口就可以完成原型模式。    MemberwiseClone() 方法: 如果是值类型,则该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象 ;因此,原始对象及其副本引用同一对象。意思就是如果“简历”类中有对象引用,那么引用的对象数据是不会被克隆的。 一、工作经历类 1 /// <summary> 2 /// 1、工作经历类 3 /// 2、ICloneable支持克隆,即用与现有实例相同的值创建类的新实例。 4 /// </summary> 5 public class WorkExperience : ICloneable 6 { 7 public string WorkDate { get; set; } 8 public string Company { get; set; } 9 public object Clone() 10 { 11 //返回当前 System.Object 的浅表副本。 12 return this.MemberwiseClone(); 13 } 14 } 二、简历类    1 public

js继承——从创建对象开始

那年仲夏 提交于 2019-12-18 12:36:51
从创建对象开始 创建对象的简单方法就是: 使用Object构造函数或者对象字面量 。但这两个方法有个缺点:创建相同对象,要编写大量重复代码。 为了避免这个问题——> 工厂模式:用函数封装以特定接口创建对象 function createPerson(name, age){ var o = new Object(); o.name = name; o.age = age; o.sayName = function(){ return this.name; } return o; } var p1 = createPerson("Tom", 23); var p2 = createPerson("Joe", 20) p1 instanceof createPerson //false 工厂模式: 优点 : 解决了创建多个相似对象问题 缺点 :没有解决 对象识别问题 (不知道对象的类型) 为了解决对象识别问题——> 构造函数模式:创建特定类型的对象 function Person(name, age){ this.name = name; this.age = age; this.sayName = function(){ return this.name; } } var p1 = new Person("Tom", 23); var p2 = new Person("Joe", 20

设计模式--原型模式

耗尽温柔 提交于 2019-12-17 08:48:10
原型模式 原型模式定义如下:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 需要注意一点的是,进行clone操作后,新对象的构造函数没有被二次执行,新对象的内容是从内存里直接拷贝的。 三、原型模式的优点和使用场景 优点: 1、性能极佳,直接拷贝比在内存里直接新建实例节省不少的资源; 2、简化对象创建,同时避免了构造函数的约束,不受构造函数的限制直接复制对象,是优点,也有隐患,这一点还是需要多留意一些。 使用场景: 1、对象在修改过后,需要复制多份的场景。如本例和其它一些涉及到复制、粘贴的场景; 2、需要优化资源的情况。如,需要在内存中创建非常多的实例,可以通过原型模式来减少资源消耗。此时,原型模式与工厂模式配合起来,不管在逻辑上还是结构上,都会达到不错的效果; 3、某些重复性的复杂工作不需要多次进行。如对于一个设备的访问权限,多个对象不用各申请一遍权限,由一个设备申请后,通过原型模式将权限交给可信赖的对象,既可以提升效率,又可以节约资源。 四、原型模式的缺点 1、深拷贝和浅拷贝的使用需要事先考虑周到; 2、某些编程语言中,拷贝会影响到静态变量和静态函数的使用。 归类 : Python--设计模式 来源: https://www.cnblogs.com/lz1996/p/11970962.html

设计模式:原型模式

我的梦境 提交于 2019-12-16 10:54:50
​ 原型模式 ​ 原型设计(prototype)用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 原型其实就是从一个对象再创建另外一个可定制的对象,动态地获取对象运行状态,而且不需知道任何创建的细节。 原型模式:制作简历实现 实际应用示例: 大专栏 设计模式:原型模式 rel="noopener noreferrer">Prorobuf Message 知乎上看到的对原型模式的意义的解释: Prototype 的意义在于,你拿到一个 Base* ,它指向某个 Derived 对象,你想克隆出 Derived 对象,但代码中不写出 Derived 的具体类型,因为有很多派生类,这种情况下你用构造函数是搞不定的,type-switch 是 bad smells 。 另外,这里考虑 virtual 的性能损失是主次不分,构造对象需要分配内存,这开销比一次虚函数调用大多了。 优点 一般在初始化不发生变化时,克隆是最好的办法。既可以隐藏对象初始化细节,而且可以大大提高性能。 来源: https://www.cnblogs.com/lijianming180/p/12046764.html

原型模式(详解)

﹥>﹥吖頭↗ 提交于 2019-12-16 02:08:52
1.原型模式的应用场景 你一定遇到过大篇幅 getter、setter 赋值的场景。例如这样的代码: public void setParam ( ExamPaperVo vo ) { ExamPaper examPaper = new ExamPaper ( ) ; //试卷主键 examPaper . setExaminationPaperId ( vo . getExaminationPaperId ( ) ) ; // 剩余时间 curForm . setLeavTime ( examPaper . getLeavTime ( ) ) ; // 单位主键 curForm . setOrganizationId ( examPaper . getOrganizationId ( ) ) ; // 考试主键 curForm . setId ( examPaper . getId ( ) ) ; // 考场主键 curForm . setExamroomId ( examPaper . getExamroomId ( ) ) ; //用户主键 curForm . setUserId ( examPaper . getUserId ( ) ) ; //专业 curForm . setSpecialtyCode ( examPaper . getSpecialtyCode ( ) )

原型模式(原型设计模式)详解

隐身守侯 提交于 2019-12-16 00:52:33
在有些系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效,就像孙悟空拔下猴毛轻轻一吹就变出很多孙悟空一样简单。 原型模式的定义与特点 原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中复制的例子非常多,这里不一一列举了。 原型模式的结构与实现 由于 Java 提供了对象的 clone() 方法,所以用 Java 实现原型模式很简单。 1. 模式的结构 原型模式包含以下主要角色。 抽象原型类:规定了具体原型对象必须实现的接口。 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。 访问类:使用具体原型类中的 clone() 方法来复制新的对象。 其结构图如图 1 所示。 图1 原型模式的结构图 2. 模式的实现 原型模式的克隆分为浅克隆和深克隆,Java 中的 Object 类提供了浅克隆的 clone() 方法,具体原型类只要实现 Cloneable 接口就可实现对象的浅克隆,这里的 Cloneable 接口就是抽象原型类。其代码如下: /

JavaScript创建对象的7大模式

时光总嘲笑我的痴心妄想 提交于 2019-12-15 10:47:59
在JavaScript中,创建对象有7大模式,分别是工厂模式、构造函数模式、原型模式、组合使用构造函数模式和原型模式、动态原型模式、寄生构造函数模式、稳妥构造函数模式。下面针对这7种模式展开讲解。 工厂模式 工厂模式抽象了创建具体对象的过程,用函数来封装以特定接口创建对象的细节。函数createPerson()能够根据接受的参数来构建一个包含所有必要信息的Person对象。可以无数次地调用这个函数,而每次它都会返回一个包含三个属性一个方法的对象。工厂模式虽然解决了创建多个相似对象的问题,但没有解决对象识别的问题。 //1.工厂模式 function createPerson ( name , age , career ) { let o = new Object ( ) ; o . name = name ; o . age = age ; o . career = career ; o . sayName = function ( ) { console . log ( this . name ) ; } return o ; } let person1 = createPerson ( "Febby" , 18 , "student" ) ; let person2 = createPerson ( "Jack" , 22 , "teacher" ) ; console .