原型模式java程序demo
时间: 2023-06-14 09:05:52 浏览: 55
下面是一个简单的Java程序示例,演示如何使用原型模式来创建对象的副本:
```java
import java.util.ArrayList;
import java.util.List;
public class PrototypeDemo {
public static void main(String[] args) {
// 创建一个原型对象
Person person = new Person();
person.setName("Tom");
person.setAge(20);
List<String> hobbies = new ArrayList<>();
hobbies.add("Swimming");
hobbies.add("Reading");
person.setHobbies(hobbies);
// 创建对象的副本
Person clone = person.clone();
System.out.println(clone.getName());
System.out.println(clone.getAge());
System.out.println(clone.getHobbies());
// 修改对象的副本
clone.setName("Jerry");
clone.getHobbies().add("Traveling");
System.out.println(clone.getName());
System.out.println(clone.getAge());
System.out.println(clone.getHobbies());
// 原型对象不受影响
System.out.println(person.getName());
System.out.println(person.getAge());
System.out.println(person.getHobbies());
}
}
class Person implements Cloneable {
private String name;
private int age;
private List<String> hobbies;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
}
@Override
public Person clone() {
try {
Person clone = (Person) super.clone();
clone.setHobbies(new ArrayList<>(this.getHobbies()));
return clone;
} catch (CloneNotSupportedException e) {
return null;
}
}
}
```
在这个例子中,我们创建了一个`Person`类作为原型对象,并实现了`Cloneable`接口来表明该类是可克隆的。我们使用`clone()`方法来创建`Person`对象的副本。请注意,在实现`clone()`方法时,我们需要注意:
- 调用父类的`clone()`方法以创建对象的副本;
- 对于可变的属性(如`hobbies`),需要创建一个新的对象来存储属性值,以避免副本和原型对象之间的共享。
在`main()`方法中,我们首先创建了一个`Person`对象,并将其赋值给变量`person`。然后,我们使用`clone()`方法来创建`person`对象的副本,并将其赋值给变量`clone`。`clone`对象的属性值与`person`对象的属性值相同。
然后,我们修改`clone`对象的一些属性值,例如`name`和`hobbies`。我们发现,这些修改不会影响原型对象`person`的属性值,因为`clone`对象和`person`对象是独立的。