
一、介绍
原型模式属于创建型设计模式 ,用于创建重复 的对象,且同时又保证了性能。
该设计模式的好处是将对象的创建与调用方分离。
其目的就是** 根据一个对象(称为原型)创建一个与其完全相同的对象(当然内存地址不同) **原对象被认为是新对象的原型。
二、实现步骤
原型模式的实现步骤如下:
- 应用原型模式的类要实现Cloneable接口。
- 应用原型模式的类要重写Object类定义的clone()方法。
- 通过调用对象的clone()方法,获得一个与该对象相同的对象。
在重写Object类定义的clone()方法时,直接通过调用super.clone()即可得到一个新对象,如下所示
三、案例
浅拷贝 :复制对象及基本数据类型,引用类型的字段共享原对象得到内存地址。
java
public class Person implements Cloneable {
private String name;
private Integer age;
private String sex;
private List<String> friends = new ArrayList<>();
public void addFriends(String friends) {
this.friends.add(friends);
}
@Override
public Person clone() {
try {
Person person = (Person) super.clone(); // 浅拷贝,items引用共享
return person;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", friends=" + friends +
'}';
}
public void setSex(String sex) {
this.sex = sex;
}
}
测试:

深拷贝:递归复制所有引用对象,确保数据独立性。
java
public class Person2 implements Cloneable {
private String name;
private Integer age;
private String sex;
private List<String> friends = new ArrayList<>();
public void addFriends(String friends) {
this.friends.add(friends);
}
@Override
public Person2 clone() {
try {
Person2 copy = (Person2) super.clone();
copy.friends = new ArrayList<>(this.friends); // 手动复制列表元素
return copy;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", friends=" + friends +
'}';
}
public void setSex(String sex) {
this.sex = sex;
}
}
测试:

四、应用场景
- 资源消耗大对象:如数据库连接配置,避免重复初始化。
- 动态状态保存:游戏存档、文档历史版本。
- 复杂对象生成:GUI控件、多层级配置对象。
七、总结
- 原型模式用于创建具有相同属性的重复对象。
- 原型模式的实现就是实现
Cloneable接口 + 重写clone()方法实现的。 Object类的clone()方法实现由JVM实现,性能较好。但仅能实现浅拷贝