原型模式
1.定义
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
Java自带一个
Cloneable
接口,原型类实现该接口并重写clone
方法,通过调用该方法创建新的对象。这种不通过new
关键字来产生一个对象,而是通过对象复制来实现的模式叫做原型模式。
原型类
public class PrototypeClass implements Cloneable {
@Override
protected Object clone() {
PrototypeClass prototypeClass = null;
try {
prototypeClass = (PrototypeClass) super.clone();
} catch (CloneNotSupportedException cloneNotSupportedException) {
// TODO 异常处理
}
return prototypeClass;
}
}
2.应用
2.1 优点
- 性能良好:原型模式是在内存二进制流的拷贝,比直接使用
new
关键字创建对象性能好很多。 - 逃避构造函数的约束:直接在内存中拷贝,不会执行其构造函数,因此也是缺点。
2.2 使用场景
- 资源优化场景:类初始化需要消耗非常多的资源。
- 性能和安全要求
- 一个对象多个修改者的场景
实际项目中,原型模式很少单独出现。一般和工厂方法模式结合使用,通过clone方法创建对象,并由工厂方法提供给调用者。
3.注意事项
3.1 构造函数不会被执行
即逃避构造函数的约束。
3.2 浅拷贝和深拷贝
若原型类中存在属性为引用对象类型时,Java做了一个偷懒的拷贝动作,Object类提供的方法只是clone本对象,对其内部的数组,引用对象等都不拷贝,还是指向原生对象的地址,即引用赋值而不是对象赋值,而基本类型都会被拷贝,这种拷贝就叫做浅拷贝。对于String
类型,没有clone方法,通过字符串池在内存中创建新字符串,因此使用时String同基本类型效果一致。
想实现对象的深入拷贝需要在原型类的clone
方法中对引用类型的对象属性再次调用clone
方法。
3.3 clone与final
对象的clone
与final
关键字是有冲突的,要使用clone方法,原型类的成员变量上不要增加final
关键字。
网友评论