原型模式
原型模式
原型模式:Prototype Pattern, PP
原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
创建型模型
原型模式核心在于拷贝原型对象
以系统中已存在的一个对象作为原型,直接基于内存二进制流进行拷贝(克隆),无需再经理耗时的对象初始化过程(不调用构造函数),使得新对象的创建时间大大减少,性能提升许多。
对不通过new 关键字,而是通过对象拷贝来实现创建对象的模式就叫原型模式
适用场景:
1、类初始化消耗资源较多
2、new 产生的一个对象需要非常繁琐的过程(数据准备、访问权限等)
3、构造函数比较复杂
4、循环体中生产大量对象时
在 Spring 中,原型模式应用的非常广泛,如:scope="prototype"
常用的 JSON.parseObject()也是一种原型模式
对于某个大对象如果有几百个属性需要复制,JDK 已经帮我们实现了一个现成的API,只需要实现 Cloneable 接口即可
浅克隆:
clone()
只是完整复制了值类型数据,没有赋值引用对象(所有引用对象仍然指向原来的对象)
只要是实现Cloneable的都是浅克隆!
ArrayList重写clone()方法还是浅克隆,适用于集合元素搬家
深克隆:
深克隆就是完全不同的对象, 例如 克隆羊、孙悟空
1、使用序列化实现深克隆
2、使用多重clone(),只要有引用类型就做一层clone() (存在硬编码,更建议使用序列化实现深克隆)
怎样做才能实现深克隆?
1、序列化(转二进制流)
2、转Json
原型模式只对结果负责
克隆破环单例模式:
如果克隆的目标对象时单例对象,意味着,深克隆会破环单例。
如何防止克隆破环单例?
禁止深克隆
方法:
1、单例类不实现 Cloneable接口
2、重写 clone()
源码中的应用
哪些接口实现了 Cloneable,即为原型模式
ArrayList 类的实现
优点:
java 自带原型模式,基于内存二进制流拷贝,比直接 new 一个对象提升了性能
使用深克隆方式可以用于保存对象的状态,在需要的时候可实现状态恢复
缺点:
需要为每个类配置克隆方法
克隆方法位于类的内部,类改造需要修改代码,违背开闭原则
在多重嵌套引用时,实现深克隆复杂
作业:
用JSON方式实现一个原型模式的深克隆,并画出UML图。