原型模式
# 1. 概述
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。
# 2. 结构
原型模式包含如下角色:
- 抽象原型类:规定了具体原型对象必须实现的的
clone()
方法。 - 具体原型类:实现抽象原型类的
clone()
方法,它是可被复制的对象。 - 访问类:使用具体原型类中的
clone()
方法来复制新的对象。
接口类图如下:
在上面的类图中:
- Prototype:抽象原型类,要求子类必须实现 clone 方法
- Realizetype:实现了抽象原型类的具体原型类,其实现了 clone 方法
- PrototypeTest:访问类,
r1
是原型对象,我们使用 clone() 复制出来了一个新的对象
# 3. 实现
原型模式的 clone 分为 shallow clone(浅克隆)和 deep clone(深克隆)。
Java 的 Object 类所提供的 clone()
的默认实现是 shallow clone。
Java 的 Cloneable 接口就是上面类图中的抽象原型类,而实现了 Cloneable
接口的子类就是具体的原型类。
示例:
- 具体的原型类:Realizetype
public class Realizetype implements Cloneable {
public Realizetype() {
System.out.println("具体的原型对象创建完成!");
}
@Override
protected Realizetype clone() throws CloneNotSupportedException {
System.out.println("具体原型复制成功!");
return (Realizetype) super.clone();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 测试访问类:
public class PrototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
Realizetype r1 = new Realizetype();
Realizetype r2 = r1.clone();
System.out.println("对象r1和r2是同一个对象?" + (r1 == r2));
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 4. 使用场景
如果对象的创建非常复杂,可以使用原型模式快捷地创建对象。
编辑 (opens new window)
上次更新: 2024/03/03, 13:24:59