原型模式

原型模式

定义

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这是一种非常简单的设计模式。

类图

代码示例

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
42
43
44
45
46
47
48
49
50
51
52
package com.zhaoyangwoo.prototype;
/**
* Created by john on 16/5/8.
*/
public class Prototype {
public static void main(String[] args){
Product p1= new Product();
p1.setName("nihao");
p1.setAge(2);
Product p2 = p1.clone();
System.out.println(p2.getName());
}
}
class Product implements Cloneable{
String name;
Integer age;
public Product() {
System.out.println("调用构造方法");
}
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;
}
@Override
public Product clone() {
try {
return (Product)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}

应用场景举例

  • 一个对象被多个对象使用并且需要修改
  • 类型需要多个对象但是对象的初始化消耗巨大

JDK源码中的模式实现

在jdk源码中,凡事实现了Cloneable接口的类均使用了此模式。例如我们经常说的Calendar
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>

思考

原型模式和构造函数

java的原型模式已经在语言中实现。只需要实现Cloneable接口,该接口没有任何实现,只是一个标志。如果没有该接口但是却重写了clone方法,使用时会报异常。

另外java中的原型是直接二进制拷贝,性能可观,这也就能说明复制出来的实体是没有执行构造函数。

深复制和浅复制

二进制流的拷贝是浅复制,对于基础类型当然生成新的备份,但是对于引用类型,新老实体对应的都是同一个引用地址。所有如果实体类有引用类型的字段,那么请在clone方法中重新为引用类型的字段分配空间赋值。

作者: wuzhaoyang(John)
出处: http://wuzhaoyang.me/
因为作者水平有限,无法保证每句话都是对的,但能保证不复制粘贴,每句话经过推敲。希望能表达自己对于技术的态度,做一名优秀的软件工程师。