原型模式
# 一、概述
原型(Prototype)模式可以使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。
一个比较合适例子就是孙悟空拔出猴毛变出许多小猴子,或者细胞克隆的过程。
# 1.1 解决了什么问题
假设有一个对象中的一些属性获取成本是比较高的(可能是从文件系统加载的、或从数据库加载的、或者是经过一系列复杂的计算得到的),而刚好当前的需求中需要多个这种相同的对象,如果在创建每个对象的时候都要经历这种成本比较高的获取方式,那系统性能将会大大降低。
或者可能这些获取成本比较高的属性可能是私有的,通过遍历属性的方式在其外部是获取不到的。
# 1.2 解决方案
原型模式为所有支持克隆的对象声明了一个克隆接口,该接口完成克隆任务,将克隆过程委派给被克隆对象。
# 二、实现方式
# 2.1 角色
原型模式有三个角色:
- 抽象原型:一个抽象类或接口,提供一个 clone 方法,具体的原型类是它的子类。
- 原型对象:抽象原型的子类,被克隆的对象,重写 clone 方法,提供克隆自己的能力。
- 客户:原型对象克隆自己得到的新对象。
# 2.2 代码
定义原型接口,该接口中只有一个 clone 方法,Monkey 类实现该接口,并重写 clone 方法完成克隆任务:
interface ProtoType {
ProtoType clone();
}
class Monkey implements ProtoType {
public int forceValue = 60;
public Monkey() {
}
private Monkey(int forceValue) {
this.forceValue = forceValue;
}
/**
* 假设猴子的成长比较耗时
*
* @throws InterruptedException
*/
public void growUp() throws InterruptedException {
System.out.println("猴子正在成长");
Thread.sleep(5 * 1000);
this.forceValue = 100;
System.out.println("猴子长大了,武力值充满,可以战斗");
}
@Override
public ProtoType clone() {
return new Monkey(this.forceValue);
}
}
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
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
public class ProtoTypeTest {
public static void main(String[] args) throws InterruptedException {
// 假设 monkey01 为孙悟空
Monkey monkey01 = new Monkey();
// 孙悟空刚开始的武力值为60,所以克隆出来的小猴子武力值是60
Monkey monkey02 = (Monkey) monkey01.clone();
System.out.println(monkey02.forceValue);
// 孙悟空发育了一会儿,武力值达到了100
monkey01.growUp();
// 此时克隆出来的小猴子武力值也是100
Monkey monkey03 = (Monkey) monkey01.clone();
System.out.println(monkey03.forceValue);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
60
猴子正在成长
猴子长大了,武力值充满,可以战斗
100
1
2
3
4
2
3
4
# 三、源码中的应用
- java.lang.Object#clone()
上次更新: 2023/11/01, 03:11:44