原型模式
用一个已经创建的实例作为原型,通过复制原型对象来创建一个和原型对象相同的新对象。
结构角色
●抽象原型类:规定了具体原型对象必须实现的clone()方法。
●具体原型类:实现抽象原型类的clone()方法,它是可被复制的对象。
●访问类:使用具体原型类中的clone()方法类复制新的对象。
原型模式的两种克隆方式
原型模式的克隆分为浅克隆和深克隆。
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于费基本类型属性,仍指向原有属性所指向的对象的内存地址。
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
package prototype;
public class Realizetype implements Cloneable {
public Realizetype(){
System.out.println("具体的原型对象创建完成!");
}
@Override
public Realizetype clone() throws CloneNotSupportedException {
System.out.println("具体原型复制成功");
return (Realizetype) super.clone();
}
}
public class client {
public static void main(String[] args) throws CloneNotSupportedException {
Realizetype realizetype=new Realizetype();
Realizetype clone=realizetype.clone();
System.out.println("原型对象和克隆出来的是否是同一个对象?"+(realizetype==clone));
}
}
public class Citation implements Cloneable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Citation clone() throws CloneNotSupportedException {
return (Citation) super.clone();
}
public void show(){
System.out.println(name+"同学,在2020学年第一学期中表现优秀,被评为三好学生,特发此状!");
}
}
public class CitationTest {
public static void main(String[] args) throws CloneNotSupportedException {
Citation citation=new Citation();
/*克隆奖状对象
* */
Citation citation1=citation.clone();
citation.setName("张三");
citation1.setName("李四");
/*调用show方法展示
* */
citation.show();
citation1.show();
}
}
浅克隆实例:
package prototype.Demo2;
public class Citation implements Cloneable{
// private String name;
//
// public String getName() {
// return name;
// }
//
// public void setName(String name) {
// this.name = name;
// }
private Student stu;
public Student getStu() {
return stu;
}
public void setStu(Student stu) {
this.stu = stu;
}
@Override
protected Citation clone() throws CloneNotSupportedException {
return (Citation) super.clone();
}
public void show(){
System.out.println(stu.getName()+"同学,在2020学年第一学期中表现优秀,被评为三好学生,特发此状!");
}
}
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
public class CitationTest {
public static void main(String[] args) throws CloneNotSupportedException {
Citation citation=new Citation();
/*克隆奖状对象
* */
Student student=new Student();
student.setName("张三");
citation.setStu(student);
Citation citation1=citation.clone();
// citation.setName("张三");
// citation1.setName("李四");
/*调用show方法展示
* */
citation.getStu().setName("李四");
citation.show();
citation1.show();
}
}