原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,其有两方面的功能:一是通过克隆来创建新的对象实例;二是为克隆出来的新的对象实例复制实例属性的值
克隆对象
实现
- 实现Cloneable接口
实现Cloneable接口,该接口没有需要实现的方法,只是一个标识接口,然后在该类中新加一个clone方法来进行克隆
Cloneable接口的作用是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常
- 重写Object类的clone方法
Object类中有一个clone方法,作用是返回对象的一个拷贝,其作用域是protected类型的,原型类需要将clone方法的作用域修改为public类型
1 | protected Object clone() throws CloneNotSupportedException { |
深拷贝和浅拷贝
- 浅拷贝 Object类提供的clone方法只是拷贝本对象,其对象内的数组、引用对象等都不拷贝,还是指向原生对象的内存地址
- 深拷贝 对引用对象变量进行独立的拷贝
优缺点
优点
- 使用原型模式创建一个对象比直接new一个对象更有效率,因为直接操作内存的二进制流,特别是复制大对象时,性能差别非常明显
- 隐藏了制造新实例的复杂性,使得创建对象就像复制粘贴一样简单
缺点
- 由于使用原型模式复制对象时不会调用类的构造方法,所以原型模式无法和单例模式组合使用
- 使用原型模式时不能有final对象
- 需要注意一下深拷贝和浅拷贝
- 每个原型的子类都需要实现clone操作,比较麻烦
使用场景
- 复制对象的结构和数据
- 希望对目标对象的修改不影响既有的原型对象
- 创建一个对象的成本比较大