原型模式,原型模式是一种创建型模式,是通过一个已经创建成功地对象,通过复制该对象创建一个和该对象相同的新对象。
原型模型的克隆分为浅克隆和深克隆:
-
浅克隆:是指仅克隆对象本身以及对象包含的基本数据类型成员变量,而不包括对象包含的引用类型成员变量,因此克隆后的对象与原始对象共享部分内存。
-
深克隆:是指将整个对象及其包含的所有成员变量都复制一份给新的对象,也就是说生成一个全新的对象,所以克隆后即使改变了其中一个对象的状态,也不会改变另一个对象的状态。
具体案例:例如在班级发奖状时,相同奖项的奖状除了获奖学生的姓名不一样,其他的都相同,这时就可以使用原型模型。
代码实现:
1、创建需要生产的东西,必须实现 Cloneable 接口和重写 clone() 方法。这里需要生产三好学生奖状。
/**
* 具体克隆类,三好学生奖状
* 必须实现 Cloneable 接口,才能使用 clone() 方法
**/
public class MeritCertificateOfMeritStudent implements Cloneable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println(this.name + "同学,在2022年到2023年期末考试中成绩优异,表现良好,被评选为三好学生。特发次奖!");
}
/**
* 克隆对象方法
**/
@Override
protected MeritCertificateOfMeritStudent clone() throws CloneNotSupportedException {
return (MeritCertificateOfMeritStudent) super.clone();
}
}
2、测试
public static void main(String[] args) throws CloneNotSupportedException {
//创建一个奖状
MeritCertificateOfMeritStudent certificate = new MeritCertificateOfMeritStudent();
certificate.setName("小美");
//克隆一个新的奖状对象
MeritCertificateOfMeritStudent certificate1 = certificate.clone();
certificate1.setName("小丽");
//展示奖状
certificate.show();
certificate1.show();
}
//测试结果
小美同学,在2022年到2023年期末考试中成绩优异,表现良好,被评选为三好学生。特发次奖!
小丽同学,在2022年到2023年期末考试中成绩优异,表现良好,被评选为三好学生。特发次奖!
Process finished with exit code 0
最后需要注意的是,在Java中Object类提供了一个clone()方法,该方法默认实现是浅克隆,所以如果需要使用深克隆来保证新对象与原型对象完全独立,则必须在原型类中自行实现克隆方法。