创建型-Prototype

简介: 1. 什么是原型模式?如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式,来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式,简称原型模式。

1. 什么是原型模式?


如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式,来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式,简称原型模式。


那何为“对象的创建成本比较大”?


实际上,创建对象包含的申请内存、给成员变量赋值这一过程,本身并不会花费太多时间,或者说对于大部分业务系统来说,这点时间完全是可以忽略的。应用一个复杂的模式,只得到一点点的性能提升,这就是所谓的过度设计,得不偿失。但是,如果对象中的数据需要经过复杂的计算才能得到(比如排序、计算哈希值),或者需要从 RPC、网络、数据库、文件系统等非常慢速的 IO 中读取,这种情况下,我们就可以利用原型模式,从其他已有对象中直接拷贝得到,而不用每次在创建新对象的时候,都重复执行这些耗时的操作。


2. 原型模式的两种实现方法


原型模式有两种实现方法,深拷贝和浅拷贝。浅拷贝只会复制对象中基本数据类型数据和引用对象的内存地址,不会递归地复制引用对象,以及引用对象的引用对象……而深拷贝得到的是一份完完全全独立的对象。所以,深拷贝比起浅拷贝来说,更加耗时,更加耗内存空间。如果要拷贝的对象是不可变对象,浅拷贝共享不可变对象是没问题的,但对于可变对象来说,浅拷贝得到的对象和原始对象会共享部分数据,就有可能出现数据被修改的风险,也就变得复杂多了。除非像我们今天实战中举的那个例子,需要从数据库中加载 10 万条数据并构建散列表索引,操作非常耗时,这种情况下比较推荐使用浅拷贝,否则,没有充分的理由,不要为了一点点的性能提升而使用浅拷贝。


原型模式的实现方式:深拷贝和浅拷贝


在 Java 语言中,Object 类的 clone() 方法执行的就是我们刚刚说的浅拷贝。它只会拷贝对象中的基本数据类型的数据(比如,int、long),以及引用对象(SearchWord)的内存地址,不会递归地拷贝引用对象本身。


那如何实现深拷贝呢?


总结一下的话,有下面两种方法。


第一种方法:递归拷贝对象、对象的引用对象以及引用对象的引用对象……直到要拷贝的对象只包含基本数据类型数据,没有引用对象为止。


第二种方法:先将对象序列化,然后再反序列化成新的对象(前提是类要实现java.io.Serializable 接口)。具体的示例代码如下所示:

public Object deepCopy(Object object) {
  ByteArrayOutputStream bo = new ByteArrayOutputStream();
  ObjectOutputStream oo = new ObjectOutputStream(bo);
  oo.writeObject(object);
  ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
  ObjectInputStream oi = new ObjectInputStream(bi);
  return oi.readObject();
}


如果该类的成员变量是类变量也需要被拷贝,则也需要手动依赖java.io.Serializable 接口。


第三种方法:可以选择使用 com.fasterxml.jackson 或 alibaba 的 fastjson 进行序列化号再进行反序列化。这种的好处就是该类不再需要依赖 java.io.Serializable 接口。


创建型模式总结



单例模式用来创建全局唯一的对象。


工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。


建造者模式是用来创建复杂对象,可以通过设置不同的可选参数,“定制化”地创建不同的对象。


原型模式针对创建成本比较大的对象,利用对已有对象进行复制的方式进行创建,以达到节省创建时间的目的。


参考



设计模式之美设计模式代码重构-极客时间


https://time.geekbang.org/column/intro/250




目录
相关文章
|
设计模式
设计模式20 - 原型模式【Prototype Pattern】
设计模式20 - 原型模式【Prototype Pattern】
38 1
|
安全 Java
创建型模式 - 原型模式(Prototype Pattern)
创建型模式 - 原型模式(Prototype Pattern)
|
设计模式 缓存 Java
《一天一个设计模式》------原型模式(Prototype)
《一天一个设计模式》------原型模式(Prototype)
108 0
《一天一个设计模式》------原型模式(Prototype)
|
设计模式 Java
设计模式-Prototype原型模式
设计模式-Prototype原型模式
设计模式-Prototype原型模式
|
设计模式 Java
浅谈JAVA设计模式之——原型模式(Prototype)
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
182 0
浅谈JAVA设计模式之——原型模式(Prototype)
|
设计模式 Java 编译器
JAVA设计模式(05):创建型-原型模式(Prototype)
转自:http://blog.csdn.net/lovesomnus/article/details/23755505
158 0
JAVA设计模式(05):创建型-原型模式(Prototype)
|
Java 安全 设计模式
设计模式五: 原型模式(Prototype)
简介 原型模式是属于创建型模式的一种,是通过拷贝原型对象来创建新的对象. 万能的Java超类Object提供了clone()方法来实现对象的拷贝. 可以在以下场景中使用原型模式: 构造函数创建对象成本太大(性能或安全成本) 要保存对象的状态, 且状态变化较小, 不会过多占用内存时(状态变化较大的使用状态模式会更合适) 意图 使用原型实例指定要创建的对象类型,并通过拷贝这个原型来创建新对象。
970 0
|
测试技术
原型模式(Prototype)
原型模式的结构 原型模式包含以下3个角色: •Prototype(抽象原型类) •ConcretePrototype(具体原型类) •Client(客户类) 浅克隆与深克隆 浅克隆(Shallow Clone):当原型对象被复制时,只复制它本身和其中包...
938 0
|
Java 设计模式