Java原型模式指的是通过复制已有对象创建新对象的模式。Java原型模式提供了一种更加灵活、更加高效的对象创建方式。与传统的new实例化方式相比,原型模式创建对象不需要调用构造函数,并且可以动态地创建新的对象实例。
常见运用场景
Java原型模式适用于以下场景:
- 需要在运行时动态创建新对象。
- 对象的创建过程比较复杂或者耗费资源,可以通过复制已有对象来提高性能。
- 需要避免调用构造函数来创建新对象,例如创建单例对象。
深克隆与浅克隆
在Java原型模式中,一般有两种复制方式:深克隆和浅克隆。
- 浅克隆
浅克隆是指在复制对象时,只复制对象本身的基本数据类型和引用数据类型的地址。也就是说,新对象和原对象共享引用类型的内存地址,对于引用类型数据的修改会影响所有共享该引用的对象。下面是一个简单实现浅克隆的示例代码:
public class Person implements Cloneable{
private String name;
private int age;
private List<String> hobbies;
public Person(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
- 深克隆
深克隆是指在复制对象时,不仅复制对象本身的基本数据类型,还复制引用数据类型的实际对象。也就是说,新对象和原对象的引用类型数据内存地址是不同的,对于引用类型数据的修改不会影响其他对象。下面是一个简单实现深克隆的示例代码:
public class PersonDeep implements Cloneable{
private String name;
private int age;
private List<String> hobbies;
public PersonDeep(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
public Object clone() throws CloneNotSupportedException{
PersonDeep personDeep = (PersonDeep)super.clone();
personDeep.hobbies = new ArrayList<String>(this.hobbies);
return personDeep;
}
}
在使用Java原型模式时,需要根据实际的需求选择适当的克隆方式。如果需要修改引用类型数据而不影响其他对象,应该使用深克隆。如果不需要修改引用类型数据或者共享数据可以使用浅克隆。