原型模式

设计模式之------原型模式

做~自己de王妃 提交于 2020-01-22 01:26:26
原型模式是用于创建重复的对象,同时又能保证性能,通过复制现有实例来创建新的实例,无需知道类的信息。 与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。 那么java中是如何实现原型模式的呢?原型模式的本质就是克隆,拷贝一个一模一样的对象。 java中的实现原型模式可以分为两种,一种是浅拷贝,一种是深拷贝。 浅拷贝实现原型模式就是实现了一个克隆接口,该接口就是用于创建当前对象的克隆。下面通过代码来实现浅拷贝。 首先定义一个类,这个类实现Cloneable接口里面的clone()方法。 public class Person implements Cloneable { String name ; int age ; int [ ] a ; @Override public Object clone ( ) throws CloneNotSupportedException { Object obj = super . clone ( ) ; return obj ; } public String getName ( ) { return name ; } public void setName ( String name ) { this . name = name ; } public int getAge ( ) { return age

原型模式(Prototype)

不羁的心 提交于 2020-01-21 15:49:48
一、定义 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 二、例子 原型(实际上是implements了Cloneable接口,进而重写clone()方法): package com.wuychn.prototype; public class ProtoType implements Cloneable { private String name; @Override public ProtoType clone() { try { return (ProtoType) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 测试代码: package com.wuychn.prototype; public class Test { public

原型模式

我怕爱的太早我们不能终老 提交于 2020-01-20 19:53:27
适用性: 1.当一个系统应该独立于它的产品创建,构成和表示时; 2.当要实例化的类是在运行时刻指定时,例如,通过动态装载; 3.为了避免创建一个与产品类层次平行的工厂类层次时; 4.当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 说实话,我对于原型模式的理解还停留在哦Entity Mapper层面,我总是觉得它的转化也是一种原型模式,因为它也将对象拷贝到一个新的地址去了 使用原型模式代码实现如下: #region 抽象原型基类 public abstract class NormalActor { public abstract NormalActor clone(); public abstract NormalActor deepClone(); } public abstract class FlyActor { public abstract FlyActor clone(); } #endregion #region 实际需要克隆类 public class NormalActor_Active : NormalActor { public List<string> list = new List<string>(); int a = 0; public override NormalActor

设计模式-02原型模式(Prototype)

吃可爱长大的小学妹 提交于 2020-01-20 13:58:39
1.模式动机 在有些系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效,就像孙悟空拔下猴毛轻轻一吹就变出很多孙悟空一样简单。 简单粗暴的理解就是:创建一个对象当做模板,然后利用这个模板使用 clone 方法快速的创建一个新的对象。 2.模式定义 原型模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。用这种方式创建对象非常高效,根本无须知道对象创建的细节。 3.模式代码 使用 Java 中提供的 clone 方法实现原型模式非常简单。但是要注意 浅克隆 和 深克隆 ,这里就不具体说这两个名词了。 import lombok.Getter; import lombok.Setter; import lombok.ToString; @Getter @Setter @ToString public class User implements Cloneable{ private String name; public User(String name) { this.name = name; } @Override protected User clone() throws CloneNotSupportedException { System.out

原型模式

好久不见. 提交于 2020-01-19 11:37:37
概念 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 优缺点: 性能优良:原型模式是在内存二进制流的拷贝,比直接new一个对象性能要好很多 逃避构造函数的约束(既是优点也是缺点) 适用场景: 资源优化场景:类的初始化需要耗费非常多的资源的情况 性能和安全要求的场景:new一个对象需要繁琐的数据准备或者访问权限的情况 一个对象多个修改者的场景:一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以拷贝多个对象供调用者使用,即保护性拷贝 代码实现 浅拷贝 @Data class Attachment { private String name; } @Data public class Mail implements Cloneable { private String receiver; private Attachment attachment; @Override protected Mail clone() { Mail cloneMail = null; try { cloneMail = (Mail) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return cloneMail; } } public class

原型模式

依然范特西╮ 提交于 2020-01-18 04:23:15
一、概述 一般问题: 有时系统中需要创建重复对象,而这些对象的构造函数比较复杂耗时。 核心方案: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 设计意图: 每当说到创建一个对象实例,我们总是想到调用构造函数new一个实例;实际上除了凭空创造一个新实例,还可以通过已有实例克隆一个实例。克隆比new的效率更高,尤其是当构造函数复杂耗时,比如需要读取数据库。 原型模式类图: 二、应用实践 (1)浅克隆与深克隆 在Java中要想克隆一个对象,必须实现空接口Cloneable,如: /** * Cloneable是一个空接口(标记接口),是一个规范。但是如果要克隆这个类对象的话必须实现Cloneable接口 */ public static class ProtoTypeTest implements Cloneable{ private int testInt = 0; private String testString = "hello"; private TestObj mObj = new TestObj(); public ProtoTypeTest(){} @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); /

原型模式

旧巷老猫 提交于 2020-01-17 00:26:50
个人博客 http://www.milovetingting.cn 原型模式 模式介绍 原型模式是一个创建型的模式。多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例,可使程序运行更高效。 模式定义 用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。 使用场景 类初始化需要消耗非常多的资源 通过new产生一个对象需要非常繁琐的数据准备或访问权限 一个对象需要提供给其它对象访问,而且各个调用者可能都需要修改值 通过实现Cloneable接口的原型模式在调用clone函数构造实例时,并不一定比通过new操作速度快,只有当通过new构造函数对象较为耗时或成本较高时,通过clone方法才能够获得效率上的提升。 简单实现 以简单的文档拷贝为例演示简单的原型模式。 先来演示浅拷贝 文档定义 public class Document implements Cloneable { private String mText; private ArrayList<String> mImages = new ArrayList<>(); public String getmText() { return mText; } public void setmText(String mText) { this.mText = mText; } public List

JavaScript创建对象的常用模式

会有一股神秘感。 提交于 2020-01-16 03:13:01
对象 面向对象语言有一个标志,那就是它们都有类的概念,通过类可以创建任意多个具有相同属性和方法的对象。 ECMAScript没有类的概念,它的对象也与基于类的语言中的对象有所不同。ECMAScript把对象定义为: 无序属性的集合,其属性可以包含基本值、对象或函数。 每个对象实例都是基于一个引用类型创建的,这个引用类型可以是ECMAScript原生类型,也可以是开发者定义的类型。 工厂模式 我们可以通过Object构造函数或对象字面量来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。 为解决上述问题,可以使用 工厂模式 创建对象。工厂模式抽象了创建具体对象的过程。 由于ECMAScript没有类,可以定义一种函数,用函数来封装以特定接口创建对象的细节。例如: function createStudent(name,age) { var obj = new Object(); obj.name = name; obj.age = age; obj.sayName = function(){ alert(obj.name); }; return obj; } var Bob = createStudent("Bob", 24); var Tom = createStudent("Tom", 28); 工厂模式虽然解决了创建多个相似对象的问题

java原型设计模式

那年仲夏 提交于 2020-01-15 04:42:44
原型模式的思想:将一个对象作为原型,对其进行复制,克隆,产生一个和原对象类似的新对象。 由上可见,一个原型类,只需要实现cloneable接口,复写clone方法。 java中的克隆,有两种:深浅之分,具体可看http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 首先是浅复制:对基本类型重新开辟空间,对引用类型,依旧指向原对象所指向的 public class Prototype implements Cloneable{ public Objec clone()throws CloneNotSupportedException{ Prototype proto = (Prototype)super.clone(); return proto; } } 再看深复制:复制该对象,基本类型,引用类型都是重新开辟空间. 深复制需要采用流的形式读入当前对象的二进制输入,再写出二进制数据对应的对象。 关于输入输出,看http://blog.csdn.net/zsw12013/article/details/6534619 public class Protopyte implements Cloneable,Serializable{ private String string; public Object deepClone

设计模式培训之六:原型模式

白昼怎懂夜的黑 提交于 2020-01-15 04:42:17
查看文章索引请通过 http://www.cnblogs.com/seesea125/archive/2012/04/17/2453256.html 一、什么是原型模式? 原型模式:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象 原型模式(Prototype结构图) 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。 二、原型模式代码实现: abstract class prototype { private string id; public prototype(string id) { this.id = id; } public string Id { get { return id; } set { id = value; } } public abstract prototype Clone();//抽象的关键就是这个Clone()这个方法. } class ConcretePrototype1:prototype { public ConcretePrototype1(string id) : base(id) { } public override prototype Clone() { return (prototype)this.MemberwiseClone();//创建当前对象的浅表副本。方法是创建一个新对象