原型模式

原型模式

十年热恋 提交于 2020-01-15 01:55:20
个人博客 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

创建型设计模式(4):原型模式

和自甴很熟 提交于 2020-01-14 23:45:45
原型模式 1.复制引用、复制对象、浅拷贝和深拷贝 复制引用 复制对象 浅拷贝和深拷贝 2.代码实现 简单深拷贝 是否做到完全深拷贝 真正深拷贝 3.通过序列化和反序列化实现深拷贝 4.使用场景 5.优缺点 类和对象的关系好比模具和构件的关系,对象总是通过构造方法从类中创建的。 但是某些场景下是不允许类的调用者直接调用构造函数,也就说对象未必需要从类中衍生出来,现实生活中存在太多案例是通过直接 “克隆” 来产生新的对象,而且克隆出来的本体和克隆体看不出任何区别。 原型模式不单是一种设计模式,也是一种编程范型。简单理解 原型模式 Prototype:不根据类来生成实例,而是根据已有的实例对象生成新的实例对象 。 1.复制引用、复制对象、浅拷贝和深拷贝 首先定义一个类, import java . util . Date ; public class Person implements Cloneable { private int age ; // 定义年龄字段 private Date birth ; // 定义生日字段 @Override protected Object clone ( ) throws CloneNotSupportedException { return super . clone ( ) ; // 调用Object类的clone方法 } public

java原型模式

こ雲淡風輕ζ 提交于 2020-01-14 04:21:58
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。很好理解,例如我们构建了一个LIST或Map对象,基于整个对象进行一个新的对象的克隆,而不是地址引用。 例: List<String> lstA=new ArrayList<>(); List<String> lstB=lstA.clone(); 此时lstB是新的地址,与lstA是完全不同的对象,只是值是一致。 用String的写法大家就明白了 String a=“a” String b=a b是一个新的String对象,而不是a的地址引用,b的更改完全不影响到a的值。 来源: https://www.cnblogs.com/fan-yuan/p/7989081.html

原型模式

穿精又带淫゛_ 提交于 2020-01-14 02:26:12
原型模式 定义: 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 类型: 创建类模式 类图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。 原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。 实现代码: class Prototype implements Cloneable { public Prototype clone(){ Prototype prototype = null;

Java设计模式四: 原型模式(Prototype Pattern)

一曲冷凌霜 提交于 2020-01-14 01:14:53
原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据. 原型模式中的拷贝分为"浅拷贝"和"深拷贝": 浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象. 深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制. 类图: 实例一:浅拷贝 public class Prototype implements Cloneable { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } } public class TestMain { public

原型模式 - OK

左心房为你撑大大i 提交于 2020-01-14 00:50:17
  原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。   简单说来原型模式就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。   原型模式UML图:        原型模式的基本代码结构: namespace ConsoleApplication1 { abstract class Prototype { private string id; public Prototype(string id) { this.id = id; } public string Id { get { return id; } } public abstract Prototype Clone(); //抽象类的关键就是要有这样一个克隆方法 } //具体原型类 class ConcretePrototype1 : Prototype { public ConcretePrototype1(string id): base(id) { } public override Prototype Clone() { return (Prototype)this.MemberwiseClone(); //创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。 //如果字段是值类型,则对该字段执行逐位复制

简说设计模式——原型模式

为君一笑 提交于 2020-01-14 00:49:52
一、什么是原型模式   还记不记得初高中学生物的时候,细胞分裂时怎么实现的,一个细胞无论是细胞核分裂还是细胞质分裂,是不是都是通过克隆自身实现的。或者说我们去复印资料的时候,是不是直接对原本的资料进行复印,得到了一个一模一样的资料,这些都可以说是原型模式,下面看一下定义。 原型模式(Prototype) ,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。UML结构图如下: 其中,Prototype为原型类,声明一个克隆自身的接口;ConcretePrototype为具体实现类,实现一个克隆自身的操作;而客户端Client只需让一个原型克隆自身,从而创建一个新的对象。 1. Prototype 1 public abstract class Prototype implements Cloneable { 2 3 private String id; 4 5 public Prototype(String id) { 6 this.id = id; 7 } 8 9 public String getId() { 10 return id; 11 } 12 13 @Override 14 public Prototype clone() { 15 Prototype prototype = null; 16 17 try { 18 prototype =

简历复印—原型模式

我的未来我决定 提交于 2020-01-14 00:48:16
《大话设计模式》书中描述 原型(Prototype)模式 :   原型模式(Prototype) : 用用原型实例指定创建对象的种类 , 并且通过拷贝这些原型创建新的对象 。 原型模式(Prototype Pattern)结构图 这种形式涉及到三个角色: 客户(Client)角色:客户类提出创建对象的请求。 抽象原型(Prototype)角色:这是一个抽象角色,通常由Java接口或Java抽象类实现。此角色给出所有的具体原型类所需的接口。 具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。 源代码:    抽象原型角色 public interface Prototype{ /* 克隆自身的方法 @return 一个从自身克隆出来的对象 */ public Object clone(); }   具体原型角色 public class ConcretePrototype1 implements Prototype { public Prototype clone(){ //最简单的克隆,新建一个自身对象,由于没有属性就不再复制值了 Prototype prototype = new ConcretePrototype1(); return prototype; } } public class

原始(Prototype)模式

喜你入骨 提交于 2020-01-14 00:48:07
  原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型对象创建新的对象。   原型模式其实就是从一个对象创建另外一个可复制的对象,而且不需要知道任何创建的细节。 (最常用的就是基于流的深复制) 原始模型模式   Java语言本身支持原始原型模式。所有的JavaBean都继承自Java.lang.Object,而Object类提供一个clone方法,可以将一个JavaBean对象复制一份。但是这个JavaBean必须实现一个表示接口Cloneable,表明这个JavaBean支持复制。如果一个对象没有实现这个接口而调用clone()方法,Java编译器会抛出CloneNotSupportedException异常。 变量、对象以及对象的引用   对象就是类的实例。一般情况下,一个类被实例化时,此类的所有成员,包括变量和方法,都被复制到属于此数据类型的一个新的实例中取。比如: User user = new User(); 上面的语句做了如下的事情: (1)创建了一个User类型的变量,称为user (2)建立了一个User类的对象 (3)使变量user指到这个对象上。 可以将上面分成下面两步: User user; user = new User();   第一行建立了一个变量叫做user,可以指到User类对象上。但在上面第一行结束时并没有指到它上面

设计模式——原型模式(Prototype)

 ̄綄美尐妖づ 提交于 2020-01-14 00:47:05
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。——DP UML类图 模式说明 如果把在一张纸上手写一篇简历的过程看成是类的实例化过程,那么通过原型模式创建对象的过程就是拿着这张纸到复印机上复印的过程。即原型模式中的一个对象可以自我克隆生成另一个对象,而无需再次通过类的初始化过程。由于克隆操作比较常见,.NET已经提供了 ICloneable 接口(包含唯一一个方法Clone),所以在.NET中,只要实现这个接口,就算实现原型模式了。 下面的示例中,定义了两个类,一个简历类和一个地址类,并且两个类都实现ICloneable接口。 /// <summary> /// 在.Net中提供了ICloneable接口,无需再定义一个父类 /// </summary> class Resume : ICloneable { public string Name { get; set; } public int Age { get; set; } public Address Addr { get; set; } public string Remark { get; set; } public Resume(string name) { Addr = new Address(); this.Name = name; } // 原型模式 public object Clone()