Java设计模式:原型模式

从原型实例复制克隆出新实例,而绝不是从类去实例化

使用场景

  • 当希望基于现有对象创建新的对象时,比如某个类的实例很复杂,如果完全重新创建成本会很高,可以将这个实例复制一份。
  • 参照原型进行量产(批量创建同类型对象实例)。

优点

  • 向客户隐藏制造新实例的复杂性
  • JVM会进行内存操作直接拷贝原始数据流,简单粗暴,不会有其他更多的复杂操作(类加载,实例化,初始化等等),速度远远快于实例化操作

缺点

  • 对象的复制有时相当复杂

例子

原型对象Phone.java

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
public class Phone implements Cloneable{

// 手机名
private String name;
// 浅拷贝只拷贝地址,需要深拷贝
private UI phoneUI = new UI();

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public void setPhoneUI(UI phoneUI) {
this.phoneUI = phoneUI;
}

@Override
protected Phone clone() throws CloneNotSupportedException {
// 浅拷贝
Phone clonePhone = (Phone)super.clone();
// 深拷贝
clonePhone.setPhoneUI(this.phoneUI.clone());
return clonePhone;
}
}

对Phone进行量产的工厂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class PhoneFactory {

// 原型
private static Phone protoType = new Phone();

// 获取克隆实例
public static Phone getInstance(int x) throws CloneNotSupportedException {
// 复制原型
Phone clonePhone = protoType.clone();
clonePhone.setName("phone:"+x);
return clonePhone;
}

}

测试原型模式创建实例

1
2
3
4
5
6
7
8
public class TestProtoType {
public static void main(String[] args) throws CloneNotSupportedException {
for (int i = 0; i < 10; i++) {
Phone phone = PhoneFactory.getInstance(i);
System.out.println(phone.toString()+"\t"+phone.getName());
}
}
}

结果

1
2
3
4
5
6
7
8
9
10
11
12
com.wangji.prototype.Phone@61bbe9ba	phone:0
com.wangji.prototype.Phone@610455d6 phone:1
com.wangji.prototype.Phone@511d50c0 phone:2
com.wangji.prototype.Phone@60e53b93 phone:3
com.wangji.prototype.Phone@5e2de80c phone:4
com.wangji.prototype.Phone@1d44bcfa phone:5
com.wangji.prototype.Phone@266474c2 phone:6
com.wangji.prototype.Phone@6f94fa3e phone:7
com.wangji.prototype.Phone@5e481248 phone:8
com.wangji.prototype.Phone@66d3c617 phone:9

Process finished with exit code 0