模式的意图
原型,可以理解为一些复制品的父类型,这些复制品都是从它而来的,而原型模式也就是要解决不希望反复使用类的构造方法创建对象而提出来的一种模式。
用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
模式的适用性
在某些情况下,可能不希望反复使用类的构造方法创建许多对象,而是希望用该类创建一个对象后,以该对象为原型得到该对象的若干个复制品。
参与者
抽象原型(Prototype):一个接口,负责定义对象复制自身的方法。
具体原型(Concrete Prototype):实现Prototyre接口的类。具体原型实现抽象原型中的方法,以便创建的对象调用该方法复制自己。
原型模式比较简单,容易理解,就是不希望不断的通过构造方法来调用对象,而是希望通过已有的原型为模板来复制对象。
通过例子来了解一下:
抽象原型
Prototype.java
public interface Prototype {
public Object cloneMe() throws CloneNotSupportedException;
}
具体原型
Cubic.java
public class Cubic {
double length,width,height;
public Cubic(double a, double b, double c) {
length = a;
width = b;
height = c;
}
public Object cloneMe() throws CloneNotSupportedException {
Cubic object = (Cubic)clone();
return object;
}
}
Goat.java
public class Goat {
StringBuffer color;
public void setColor(StringBuffer c) {
color = c;
}
public StringBuffer getColor() {
return color;
}
public Object cloneMe() throws CloneNotSupportedException {
Object object = null;
try {
ByteArrayOutputStream outOne = new ByteArrayOutputStream();
ObjectOutputStream outTwo = new ObjectOutputStream(outOne);
outTwo.writeObject(this);
ByteArrayInputStream inOne = new ByteArrayInputStream(outOne.toByteArray());
ObjectInputStream inTwo = new ObjectInputStream(inOne);
object = inTwo.readObject();
} catch (Exception e) {
System.out.println(e);
}
return object;
}
}
我们在具体原型中定义了两个原型,都实现了cloneMe()这个方法,我们可以通过这两个方法调用来得到这两个具体原型的复制品。
具体类图:
优点
- 当创建类的新实例的代价更大时,使用原型模式复制一个已有的实例可以提高创建新实例的效率。
- 可以动态的保存当前对象的状态。
- 可以在运行时创建新的对象,而无须创建一系列类和继承结构。
- 可以动态的添加、删除原型的复制品。