0%

GoF设计模式(二):Prototype Pattern 原型模式

Prototype Pattern 原型模式的目的是快速地复制出一个重复的对象实例,其同样是创建型模式的一种。这个被复制的实例即为原型

abstract.jpeg

概述

如果需要创建一个重复的对象实例,常见的方式是通过构造器new并不断调用setXxx方法来实现。这样做一来繁琐不够简洁,二来效率较低。而且不便于在运行时动态改变类的具体实现类型。而 Prototype Pattern 原型模型则可以更好的解决这个问题。在Prototype Pattern 原型模式中,其有两个角色:

  • 原型抽象角色:其定义了具体原型角色所需要实现的方法,在Java中可通过接口或抽象类类实现
  • 具体抽象原型:其是原型抽象角色的具体实现类,需要在具体的实现类中实现克隆复制的具体方法

基于接口(抽象类)-实现的设计思想,将定义与实现进行了解耦。方便运行时动态改变具体的实现

实现

在Java中天然的支持对实例对象进行克隆复制,只需实现Cloneable接口、重写clone方法即可。而且通过克隆机制创建实例,相比较于构造器的方式而言,大大提高了效率。现在我们通过Java来实现原型模式以更好的理解它。首先定义一个Animal抽象类,其定义了一些共有的方法,并重写了clone方法以通过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
/**
* 原型的抽象类
*/
@Getter
@Setter
public abstract class Animal implements Cloneable {
private String description;
private String type;

abstract public void getInfo();

/**
* 深拷贝,通过Java的克隆机制实现原型模式
* @return
*/
public Animal clone() {
Animal animal = null;
try{
animal = (Animal) super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
return animal;
}
}

然后定义了Animal的具体实现类——Cat、Dog

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
/**
* 原型的实现类: 猫
*/
@Getter
@Setter
public class Cat extends Animal {
private Double catWeight;

public Cat(String description, String type, Double catWeight){
setDescription(description);
setType(type);
this.catWeight = catWeight;
}

@Override
public void getInfo() {
String info = "["+ getType() +"]: " + getDescription() + ", catWeight: " + getCatWeight();
System.out.println(info);
}

@Override
public Cat clone() {
return (Cat) super.clone();
}
}
...
/**
* 原型的实现类: 狗
*/
@Getter
@Setter
public class Dog extends Animal {
private Boolean isMale;

public Dog(String description, String type, Boolean isMale){
setDescription(description);
setType(type);
this.isMale = isMale;
}

@Override
public void getInfo() {
String info = "["+ getType() +"]: " + getDescription() + ", isMale: " + getIsMale();
System.out.println(info);
}

@Override
public Dog clone() {
return (Dog) super.clone();
}
}

至此,Prototype Pattern 原型模式就已经实现完毕了,可以看到其还是比较简单易懂的。现在我们来测试下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class PrototypePatternDemo1Test {
public static void main(String[] args) {
System.out.println("----------- Test 1 -----------");
Cat cat1 = new Cat("我是一只猫", "Cat", 2.0);
Animal cat2 = cat1.clone();

cat1.getInfo();
cat2.getInfo();

System.out.println(cat1);
System.out.println(cat2);

System.out.println("----------- Test 2 -----------");
Dog dog1 = new Dog("我是一只边牧", "Dog", true);
Animal dog2 = dog1.clone();

dog1.getInfo();
dog2.getInfo();

System.out.println(dog1);
System.out.println(dog2);
}
}

测试结果如下,可以看到原型对象被正确的复制了

figure 1.png

参考文献

  1. Head First 设计模式 弗里曼著
请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝