1. 代碼示例
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* @authod: pp_lan on 2020/3/20.
* 原型模式:淺複製、深複製
*/
public class ProtoType {
/**
* 深複製 實現序列化接口Serializable
* @param t
* @param <T>
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static <T> T deepCopy(T t) throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oops = new ObjectOutputStream(baos);
oops.writeObject(t);
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
return (T) ois.readObject();
}
/**
* 淺複製 實現Cloneable接口
* @param car
* @return
* @throws CloneNotSupportedException
*/
public static Car clone (Car car) throws CloneNotSupportedException {
return car.clone();
}
public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {
Car car = new Car("奔馳");
Car clone = clone(car);
Car deepCopy = deepCopy(car);
clone.setName("寶馬");
clone.getList().add("真皮座椅");
deepCopy.setName("雷克薩斯");
deepCopy.getList().add("安全氣囊");
System.out.println(car.getName());
System.out.println(clone.getName());
System.out.println(deepCopy.getName());
System.out.println("=============");
System.out.println(car.getList());
System.out.println(clone.getList());
System.out.println(deepCopy.getList());
}
}
class Car implements Cloneable, Serializable {
private String name;
private List<String> list;
public Car(String name) {
this.name = name;
this.list = new ArrayList<>();
list.add("輪胎");
list.add("車身");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
@Override
protected Car clone() throws CloneNotSupportedException {
return (Car) super.clone();
}
}
2. 運行結果
奔馳
寶馬
雷克薩斯
=============
[輪胎, 車身, 真皮座椅]
[輪胎, 車身, 真皮座椅]
[輪胎, 車身, 安全氣囊]
3. 結論
淺複製後的值傳遞變量不會改變原對象值,但是地址指向的變量會改變原對象值;
深複製二者都不改變。