设计模式之美-创建型模式-原型模式
创始人
2025-06-01 17:33:13
0

原型模式

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

原型模式的两种实现方式

浅拷贝:当拷贝对象包含基本数据类型(如int、long)或者不可变的对象(如字符串、基本类型的包装类)时,会直接将这些属性复制到新的对象中。而原型对象中的引用对象会把内存中的地址复制给克隆对象。此时,两个对象共享了一个私有变量,你改我改大家都能改。

深拷贝:不管原型对象属性是简单数据类型还是引用对象类型都会完全的复制一份到新的对象中。两个对象之间互不影响。

那原型模式该如何实现深拷贝呢?

 @Datapublic class ConcretePrototype implements Serializable, Cloneable {private Long num;private ArraylisteObject> list;@Overridepublic ConcretePrototype clone() {ConcretePrototype concretePnototype = null;try {// 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVH里面。所以利用这个特性可以实现对象的深找贝ByteArrayOutputStream bas = new ByteArrayOutputStrean();ObjectOutputStream oos = new                    ObjectOutputStream(bas);oos.mrite0bject(this);// 再将溃序列化成对象ByteArrayInputStream bis = new ByteArrayInputStream(bas.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);concnetePrototype = (ConcretePrototype) ois.readobject(0);} catch (Exception e) {e.printStackTrace();}return concretePrototype;}}

原理:

序列化需要使用的两个类:ObjectOutputStream类用于序列化、ObjectInputStream用于反序列化。

首先使用ObjectOutputStream类将对象写入到ByteArrayOutputStream中,然后将ByteArrayOutputStream中的字节序列递交给ByteArrayInputStream,最后使用ObjectInputStream将ByteArrayInputStream中的字节序列重新反转为一个对象。

注意:深拷贝比浅拷贝需要更多的资源,按照实际场景选择。现在已经有很多针对浅深拷贝的工具类

深拷贝:SerializationUtils

浅拷贝:BeanUtils

原型模式的优点

1、原型模式是在内存中进行二进制流的拷贝,要比直接new一个对象性能好,特别是在一个循环体内创建大量对象时。

2、原型模式可以简化对象创建的过程,可以直接拷贝现有的原型实例的值,实现对象复用。

适用场景

1、性能优化场景:类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。

2、安全访问场景:当某个对象对外可能是只读的,为了防止外部对这个只读对象的修改,通常可以通过返回一个对象拷贝的形式实现只读的限制。

3、一个对象多个修改者的场景:一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

相关内容

热门资讯

收购扫地机器人鼻祖,深圳如何“... 12月15日,美国扫地机器人行业开创者iRobot宣布进入破产程序,解救它的重组企业,是位于中国深圳...
中航成飞:全资子公司拟4.22... 新京报贝壳财经讯 12月16日,中航成飞发布公告称,全资子公司司成都飞机工业(集团)有限责任公司(简...
海欣食品募投项目又延期,关键设... 新京报贝壳财经讯(记者阎侠)12月16日,海欣食品董事会审议通过了《关于部分募投项目延期的议案》,同...
巴奴更新招股书:2025年前三... 新京报贝壳财经讯 12月17日,据港交所最新文件,巴奴国际控股有限公司更新了向港交所提交的招股说明书...
苏宁系38家公司重整草案表决期... 12月17日,澎湃新闻获悉,苏宁电器集团等38家公司(以下简称“苏宁系公司”)实质合并重整草案的表决...
夜郎古酒业回应被郎酒起诉要求更... 11月11日消息,贵州省仁怀市茅台镇夜郎古酒业股份有限公司(下称夜郎古酒业)发出声明,称11月8日收...
银行提供235亿元贷款支持上市... 11月11日消息,自央行设立股票回购增持再贷款以来,已有超百家沪深上市公司披露与银行签署的贷款协议或...
微信视频号直播正在内测“K歌房... 11月11日消息,据“微信派”微信公众号消息,视频号直播正在内测“K歌房”玩法,在视频号直播开播页面...
我国第三家持牌个人征信机构获批 11月11日消息,中国人民银行今天发布公告,批准钱塘征信有限公司个人征信业务许可,这是我国批准的第三...
自然资源部:积极运用地方政府专... 11月11日消息,自然资源部发布关于运用地方政府专项债券资金收回收购存量闲置土地的通知,提出积极运用...