定义
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
核心是一个close方法
通用代码
public class PrototypeClass implements Cloneable {
// 覆写父类Object 方法
@Override
public PrototypeClass clone() {
PrototypeClass prototypeClass = null;
try {
prototypeClass = (PrototypeClass)super.clone();
} catch(CloneNotSupportedException e) {
// 异常处理
}
return prototypeClass;
}
}
实现一个接口,然后重写clone()方法,完成原型模式
优点
- 性能优良
- 原型模式是内存二进制流的拷贝,比直接new一个对象性能好得多,特别是在一个循环体内产生大量对象的时候。
- 逃避构造函数的约束
- 这是优点也是缺点,直接在内存拷贝,构造函数不会执行
使用场景
- 资源优化场景,类的初始化需要消耗非常多资源,包括数据,硬件资源等。在Linux 0.11内核中,所有任务都是任务0的拷贝,就是用了原形模式。
- 性能和安全要求的场景。当通过new产生一个对象需要非常繁琐的数据准备和访问权限,可以使用原型模式
- 一个对象多个修改者的场景。在实际项目中,原型模式一般配合工厂方法模式一起,通过clone产生对象,由工厂方法提供给调用者。
注意
- 构造函数不会执行,构造函数不会执行,构造函数不会执行 重要的话说三遍
- 深拷贝和浅拷贝的区别。对int, long, char, string是深拷贝,其他可变的引用对象都是浅拷贝。
// 深拷贝代码
public class PrototypeClass implements Cloneable {
private List<String> arrayList = new ArrayList<String>();
// 覆写父类Object 方法
@Override
public PrototypeClass clone() {
PrototypeClass prototypeClass = null;
try {
prototypeClass = (PrototypeClass)super.clone();
prototypeClass.arrayList = (ArrayList<String>)this.arrayList.clone();
} catch(CloneNotSupportedException e) {
// 异常处理
}
return prototypeClass;
}
}
- 要使用clone方法,类的成员变量上不要增加final关键字
参考
《设计模式之禅》