不用重新初始化对象,而是动态地获得对象运行时的状态。适用于当创建对象的成本较高时,如需进行复杂的数据库操作或复杂计算才能获得初始数据。
优点是可以隐藏对象创建的细节,减少重复的初始化代码;可以在运行时动态地增加和删除产品。
原型模式(Prototype),用原型实例指定创建对象的种类,并且通
过复制这些原型创建新的对象
"原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
Cloneable
接口来达到这个目的。Cloneable
接口作为原型。Cloneable
接口。clone()
方法,根据需要进行深拷贝或浅拷贝。clone()
方法来获取对象的副本。一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高,
public class ShallowCopyExample implements Cloneable {
private int[] data;
public ShallowCopyExample() {
data = new int[10];
for (int i = 0; i < data.length; i++) {
data[i] = i;
}
}
public void setData(int index, int value) {
data[index] = value;
}
public int[] getData() {
return data;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) {
ShallowCopyExample e1 = new ShallowCopyExample();
ShallowCopyExample e2 = null;
try {
e2 = (ShallowCopyExample) e1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
e1.setData(0, 999);
int[] e2Data = e2.getData();
System.out.println("Shallow Copy Example: " + e2Data[0]); // 输出 999,因为是浅拷贝
}
}
和上面浅拷贝不同的是重写 clone()
方法,在其中不仅调用 super.clone()
,还要为所有的对象成员变量创建新的实例。
public class DeepCopyExample implements Cloneable {
private int[] data;
public DeepCopyExample() {
data = new int[10];
for (int i = 0; i < data.length; i++) {
data[i] = i;
}
}
public void setData(int index, int value) {
data[index] = value;
}
public int[] getData() {
return data;
}
@Override
protected Object clone() throws CloneNotSupportedException {
DeepCopyExample copy = (DeepCopyExample) super.clone();
copy.data = data.clone(); // 复制数组,而不是引用
return copy;
}
public static void main(String[] args) {
DeepCopyExample e1 = new DeepCopyExample();
DeepCopyExample e2 = null;
try {
e2 = (DeepCopyExample) e1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
e1.setData(0, 999);
int[] e2Data = e2.getData();
System.out.println("Deep Copy Example: " + e2Data[0]); // 输出 0,因为是深拷贝
}
}