原型模式

原型模式

结构

  • 抽象原型类:规定了具体原型对象实现Clone方法
  • 具体原型类:实现抽象原型类的Clone方法,他是可复制的对象
  • 访问类:使用具体类型中的clone方法复制新的对象

类图:

image-20230528184009717

深、浅克隆

  • 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。

  • 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

示例

克隆类实现Cloneable接口,重写**clone()**方法,创建对象时,调用该方法,就会生成一个地址不同的对象

代码

1
2
3
4
5
6
7
8
public class Dog implements Cloneable {

@Override
protected Dog clone() throws CloneNotSupportedException {
System.out.println("克隆了一个狗对象");
return (Dog) super.clone();
}
}

测试

image-20230528185728855

深克隆

深克隆使用对象流序列化到文本,然后反序列化读取到程序里,就可以得到不同的对象了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class CitationTest1 {
public static void main(String[] args) throws Exception {
Citation c1 = new Citation();
Student stu = new Student("张三", "西安");
c1.setStu(stu);

//创建对象输出流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\Think\\Desktop\\b.txt"));
//将c1对象写出到文件中
oos.writeObject(c1);
oos.close();

//创建对象出入流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\Think\\Desktop\\b.txt"));
//读取对象
Citation c2 = (Citation) ois.readObject();
//获取c2奖状所属学生对象
Student stu1 = c2.getStu();
stu1.setName("李四");

//判断stu对象和stu1对象是否是同一个对象
System.out.println("stu和stu1是同一个对象?" + (stu == stu1));

c1.show();
c2.show();
}
}