java - 设计模式-原型模式
java - 设计模式-原型模式
原型模式(ProtoType)
- 用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象
- 原型模式是一种创建型模式,允许一个对象再创建另外一个可定制的对象,无需知道任何创建的细节
- 工作原理是通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,即对象.clone
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package CreationalPattern.ProtoTypePattern;
public class Main {
public static void main(String[] args)
{
ProtoType pt1 =new ProtoType(1);
ProtoType pt2 = new ProtoType(2);
pt1.setProtoType(pt2);
System.out.println(pt1.toString());
try {
ProtoType pt3 = (ProtoType) pt1.clone();
System.out.println(pt3.toString());
}catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package CreationalPattern.ProtoTypePattern;
/**
* 原型模式
*/
public class ProtoType implements Cloneable {
public int id;
public void setProtoType(ProtoType protoType) {
this.protoType = protoType;
}
private ProtoType protoType;
public ProtoType(int id)
{
this.id = id;
}
@Override
public String toString() {
return "id:"+id+" protoType:"+protoType.hashCode();
}
@Override
protected Object clone() throws CloneNotSupportedException {
ProtoType protoType=null;
try {
protoType = (ProtoType) super.clone();
}catch (Exception e)
{
System.out.println(e.getMessage());
}
return protoType;
}
}
输出结果
id:1 protoType:603742814 id:1 protoType:603742814
对于引用传递的对象再克隆的时候,传递的是地址,这里克隆模式使用的是浅拷贝
浅拷贝
- 对于数据类型是基本数据类型的成员变量,直接进行值传递
- 对于引用类型的成员变量,例如数组,或者成员对象,浅拷贝进行引用传递,也就是只会复制地址,在一个对象修改该成员变量,会影响到另一个对象的该成员变量值
深拷贝
- 复制对象的所有基本数据类型的成员变量值
- 为所还有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达到所有的对象。
深拷贝实现
- 重写 clone 方法来实现深拷贝
- 对象序列化实现深拷贝
本文由作者按照 CC BY 4.0 进行授权