简介
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
角色分析
抽象原型类:规定了具体原型对象必须实现的接口。
具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
访问类:使用具体原型类中的 clone() 方法来复制新的对象。
代码实现
//浅克隆 非基本类型属性,仍指向原有属性所指向的对象的内存地址
class User implements Cloneable {
User () {
System.out.println("具体原型创建");
}
public Object clone() throws CloneNotSupportedException {
System.out.println("复制");
return (Realizetype) super.clone();
}
}
//测试
public class App {
public static void main(String[] args) throws CloneNotSupportedException {
User user1 = new User ();
User user2= (User ) user1.clone();
System.out.println("user1==user2?" + (user1 == user2));
}
}
//深克隆1
class User implements Cloneable {
Desk desk;
public User clone() throws CloneNotSupportedException {
User userclone = (User ) super.clone();
Desk desk = new Desk();
desk.setShape(userclone.desk.getShape());
userclone.setDesk(desk);
return userclone ;
}
}
public class Desk {
String shape;
public Desk(String shape) {
this.shape = shape;
}
}
//测试
public class App {
public static void main(String[] args) throws CloneNotSupportedException {
User user = new User (new Desk("圆桌"));
User userclone = user.clone();
}
}
//深克隆2
class User implements Cloneable {
Desk desk;
public User clone() throws CloneNotSupportedException {
User userclone = (User ) super.clone();
Desk desk = (Desk) this.desk.clone();//克隆一个desk
userclone.setDesk(desk);
return userclone ;
}
}
public class Desk implements Cloneable {
String shape;
public Desk(String shape) {
this.shape = shape;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
//测试
public class App {
public static void main(String[] args) throws CloneNotSupportedException {
User user = new User (new Desk("圆桌"));
User userclone = user.clone();
}
}