立即学习:https://edu.csdn.net/course/play/28941/403601?utm_source=blogtoedu
原型模式的通用写法
IProtortype接口
public interface IProtortype <T>{
T clone();
}
创建具体需要克隆对象的类ConcretePrototype
public class ConcretePrototype implements IProtortype{
private int age;
private String name;
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
@Override
public ConcretePrototype clone() {
ConcretePrototype concretePrototype = new ConcretePrototype();
concretePrototype.setAge(this.age);
concretePrototype.setName(this.name);
return concretePrototype;
}
public String toString(){
return "ConcretePrototype{"+
"age = " + age +
", name = " + name +'\''+
'}';
}
}
浅克隆
import lombok.Data;
import java.util.List;
@Data
public class ConcretePrototype implements Cloneable {
private int age;
private String name;
private List<String> hobbies;
@Override
public ConcretePrototype clone() {
try {
//这是浅克隆,对引用类型的属性只能克隆其引用,而不是其值(也就是克隆对象与原型对象的
// 引用类型的属性指向同一个内存地址)
return (ConcretePrototype)super.clone();
}catch (Exception e){
return null;
}
}
public String toString(){
return "ConcretePrototype{"+
"age = " + age +
", name = '" + name +'\''+
", hobbies = " + hobbies +
'}';
}
}
深克隆
//序列化实现深克隆
@Data
public class ConcretePrototype implements Cloneable, Serializable {
private int age;
private String name;
private List<String> hobbies;
@Override
public ConcretePrototype clone() {
try {
//这是浅克隆,对引用类型的属性只能克隆其引用,而不是其值(也就是克隆对象与原型对象的
// 引用类型的属性指向同一个内存地址)
return (ConcretePrototype)super.clone();
}catch (Exception e){
return null;
}
}
//硬编码实现深克隆 将原型的引用属性进行拷贝或克隆
public ConcretePrototype deepCloneHobbies() {
try {
ConcretePrototype result = (ConcretePrototype) super.clone();
result.hobbies = (List) ((ArrayList) result.hobbies).clone();
return result;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//序列化实现深克隆
public ConcretePrototype deepClone(){
try{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (ConcretePrototype) ois.readObject();
}catch (Exception e){
e.printStackTrace();
return null;
}
}
public String toString(){
return "ConcretePrototype{"+
"age = " + age +
", name = '" + name +'\''+
", hobbies = " + hobbies +
'}';
}
}