0%

原型模式

原型模式

原型模式属于创建型设计模式。基于一个已创建的原型对象,以拷贝的方式快速创建其它对象。

问题

当你想创建一个一模一样或者仅仅有一点区别的对象,你可能没有这个对象真正的实现类或者没有这个对象创建过程所经历的过程。

解决方案

使用原型模式将克隆的过程委派给实际被克隆的对象进行,被克隆的对象被认为是原型。这样可以快速创建一个相同的对象。

优点

  1. 你可以克隆对象, 而无需与它们所属的具体类相耦合。

  2. 你可以克隆预生成原型, 避免反复运行初始化代码。

  3. 你可以更方便地生成复杂对象。

  4. 你可以用继承以外的方式来处理复杂对象的不同配置。

缺点

  1. 克隆包含循环引用的复杂对象可能会非常麻烦。
  • 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。

  • 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

模式结构图

实现

完整代码地址

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
53
public class Robot implements Cloneable {
private int id = -1;
private String name = "";
private String color = "";
private String height = "";
private String weight = "";
private Weapon mWeapon = null;

public Robot(int id, String name, String color, String height, String weight) {
this.id = id;
this.name = name;
this.color = color;
this.height = height;
this.weight = weight;
}

public Robot(int id, String name, String color, String height, String weight, Weapon weapon) {
this.id = id;
this.name = name;
this.color = color;
this.height = height;
this.weight = weight;
this.mWeapon = weapon;
}

public void setId(int id) {
this.id = id;
}

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

public void setColor(String color) {
this.color = color;
}

public void setWeapon(Weapon weapon) {
this.mWeapon = weapon;
}

@Override
public String toString() {
return String.format("Robot[id = %d, name = %s, color = %s, height = %s, weight = %s, weapon = %s", id, name, color, height, weight, mWeapon);
}

@Override
protected Object clone() throws CloneNotSupportedException {
Robot copyObject = (Robot) super.clone();
copyObject.setWeapon((Weapon)mWeapon.clone());
return copyObject;
}
}

适用场景

  • 如果你需要复制一些对象,又不希望对这些对象所属的具体类产生依赖关系
  • 如果子类的区别仅在于对象的初始化方式,可以使用此模式减少子类的数量

java中实现了java.lang.cloneable接口的类