设计模式-原型模式
定义
原型模式(Prototype Pattern)是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,属于创建型模式。
原型模式的核心在于拷贝原型对象。以系统中已存在的一个对象为原型,直接基于内存二进制流进行拷贝,无需再经历耗时的对象初始化过程(不调用构造函数),性能提升许多。当对象的初始化过程比较耗时时,可以利用当前系统已存在的对象做为原型,对其进行克隆(一般是基于内存二进制流)来躲避初始化过程,使得新对象的创建时间大大减少。
原型模式主要使用场景:
1、类初始化消耗资源较多;
2、new产生的一个对象需要非常繁琐的过程(数据准备、访问权限等);
3、构造函数比较复杂;
4、循环体中产生大量对象时。
在Spring中,原型模式应用的非常广泛。例如scope="prototype",在我们经常用的JSON.parseObject()也是一种原型模式。
优点
1、性能良好,Java自带的原型模式是基于内存二进制流的拷贝,比直接new一个对象性能上提升了许多。
2、可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来, 简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可付诸实现撤销操作。
缺点
1、需要对每一个类配置一个克隆方法;
2、克隆方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违反了开闭原则;
3、在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。因此,深、浅拷贝需要运用得当。
代码实例
扩展
因为深拷贝使用了序列化机制,序列化机制会破坏单例模式.
解决方案:要么单例类不实现Cloneable接口,要么重写clone()方法,在clone方法中返回单例对象即可,如下: