/*
* 只有实现标记接口Cloneable才能clone,此时的clone是浅复制,深复制需要重载clone方法
* 且Object是没有实现Cloneable接口的
* */
public interface Product extends Cloneable {
public abstract void use(String s);
public abstract Product createClone();
}
Java的深浅复制:https://blog.csdn.net/qq_33061377/article/details/64133251
/*
* 除基本类型,String外其他对象均是浅复制,即只复制对象的引用,需要子类重载clone方法
* */
public class MessageBox implements Product {
private char decochar;
public MessageBox(char decochar) {
this.decochar = decochar;
}
@Override
public void use(String s) {
int length = s.length();
for (int i = 0; i < length + 4; i++) {
System.out.print(decochar);
}
System.out.println("");
System.out.println(decochar + " " + s + " " + decochar);
for (int i = 0; i < length + 4; i++) {
System.out.print(decochar);
}
}
@Override
public Product createClone() {
Product p = null;
try {
p = (Product)clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
public class Manager {
private HashMap<String, Object> showCase = new HashMap<>();
public void register(String name, Product product) {
showCase.put(name, product);
}
public Product create(String productName) {
Product p = (Product)showCase.get(productName);
return p.createClone();
}
}
深复制需要每个成员都实现clone,然后逐级的复制
public class ManagerTest {
private Manager manager = new Manager();
private MessageBox messageBox = new MessageBox('*');
@org.junit.Test
public void register() throws Exception {
manager.register("shixiaodong", messageBox);
}
@org.junit.Test
public void create() throws Exception {
manager.register("shixiaodong", messageBox);
Product product = manager.create("shixiaodong");
product.use("Hello World");
/*因为实现了clone,两个product是不同的对象,
*至于内部的属性是否相同,需要看是否实现clone
*/
System.out.println(product);
}
}