介绍
我理解的原型,即所有使用原型对象的地方,都是使用的原型对象的拷贝,所有使用的地方都是拿到原型对象的当前状态.
解决问题: 创建重复对象,同时保证性能.
UML图
代码
原型接口
public interface Prototype<T> extends Cloneable {
T clone();
}
原型模式类
public class ConcretePrototype implements Prototype<ConcretePrototype> {
public ConcretePrototype clone() {
try {
return (ConcretePrototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
使用者
public class Client {
public static void main(String[] args) {
Prototype<ConcretePrototype> concretePrototype = new ConcretePrototype();
Prototype<ConcretePrototype> cloneObj = concretePrototype.clone();
System.out.println(concretePrototype == cloneObj);
System.out.println(concretePrototype.getClass().equals(cloneObj.getClass()));
}
}
其他
当实现了 Cloneable
接口后, JVM 对于clone()
方法的默认实现是, 对基本类型深度拷贝, 其他类对象都是只拷贝了对象引用.所以如果需要实现完全深度拷贝的话,需要自己手动拷贝.例如:
public class Example implements Cloneable {
private ArrayList<String> list;
@Override
public Example clone() throws CloneNotSupportedException {
Example cloneObj = (Example)super.clone();
cloneObj.list = (ArrayList<String>) list.clone();
return cloneObj;
}
}
参考
http://www.cnblogs.com/zxy562323273/p/3559832.html
http://www.cnblogs.com/java-my-life/archive/2012/04/11/2439387.html