1. 通过拷贝原型创建新的对象,跳过了构造函数的执行,性能优于通过new直接创建对象
/**
* @author beck.yang
* @date 2022/7/1 10:54
* @description
*/
public class User implements Cloneable{
private String name;
private int age;
public User(String name, int age){
System.out.println("构造方法...");
this.name = name;
this.age = age;
}
@Override
protected User clone() {
User user = null;
try {
user = (User) super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return user;
}
@Override
public String toString() {
return "name:" + name + ",age:" + age;
}
}
/**
* @author beck.yang
* @date 2022/7/1 10:54
* @description 原型模式
*/
public class Main {
public static void main(String[] args) {
User user = new User("zhangsan", 20);
System.out.println(user);
User clone = user.clone();
System.out.println(clone);
}
}
2. 浅拷贝与深拷贝
2.1 浅拷贝,java中Object的clone()方法,对于引用对象拷贝的是内存地址
/**
* @author beck.yang
* @date 2022/7/1 10:54
* @description
*/
public class User implements Cloneable{
private String name;
private int age;
private List<String> hobbies;
public User(String name, int age){
System.out.println("构造方法...");
this.name = name;
this.age = age;
this.hobbies = new ArrayList<>();
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(String hobby) {
this.hobbies.add(hobby);
}
@Override
protected User clone() {
User user = null;
try {
user = (User) super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return user;
}
}
/**
* @author beck.yang
* @date 2022/7/1 10:54
* @description 原型模式
*/
public class Main {
public static void main(String[] args) {
User user = new User("张三", 20);
user.setHobbies("写代码");
System.out.println(user.getHobbies());
User clone = user.clone();
clone.setHobbies("设计模式");
System.out.println(clone.getHobbies());
System.out.println(user.getHobbies());
}
}
2.2 深拷贝的实现
/**
* @author beck.yang
* @date 2022/7/1 10:54
* @description
*/
public class User implements Cloneable{
private String name;
private int age;
private ArrayList<String> hobbies;
public User(String name, int age){
System.out.println("构造方法...");
this.name = name;
this.age = age;
this.hobbies = new ArrayList<>();
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(String hobby) {
this.hobbies.add(hobby);
}
@Override
protected User clone() {
User user = null;
try {
user = (User) super.clone();
// 深拷贝
this.hobbies = (ArrayList<String>) this.hobbies.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return user;
}
}
/**
* @author beck.yang
* @date 2022/7/1 10:54
* @description 原型模式
*/
public class Main {
public static void main(String[] args) {
User user = new User("张三", 20);
user.setHobbies("写代码");
System.out.println(user.getHobbies());
User clone = user.clone();
clone.setHobbies("设计模式");
System.out.println(clone.getHobbies());
System.out.println(user.getHobbies());
}
}