用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,
所以Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节。
以细胞为例:细胞a克隆出细胞b,细胞a、b具有相同的属性
如果以一般的做法我们会这样:
public class Cell {
// 细胞壁
private String cellWall = null;
// 细胞膜
private String membrane = null;
// 细胞核
private String nucleus = null;
/**
* 省略get、set方法
*/
客户端调用:
// 产生细胞A
Cell cellA = new Cell("细胞壁", "细胞膜", "细胞核");
/* 产生与A同样的细胞B */
Cell cellB = new Cell();
cellB.setCellWall(cellA.getCellWall());
cellB.setMembrane(cellA.getMembrane());
cellB.setNucleus(cellB.getNucleus());
这种繁琐而重复性高的复制能不能只写一遍呢?答案是“有”
public class Cell implements Cloneable {
// 细胞壁
private String cellWall = null;
// 细胞膜
private String membrane = null;
// 细胞核
private String nucleus = null;
public Cell clone() throws CloneNotSupportedException {
return (Cell)super.clone();
}
客户端调用:
public class PrototypeClient {
public static void main(String[] args) throws CloneNotSupportedException {
// 产生细胞A
Cell cellA = new Cell("细胞壁", "细胞膜", "细胞核");
/* 产生与A同样的细胞B */
Cell cellB = cellA.clone();
System.out.println(cellA == cellB);
}
}
上述程序运行的结果为false,说明clone()在内存区开辟了另一块引用。以上的clone方法也被称为“浅度拷贝”,关于深度拷贝这里就不做详说了。
在一个复杂的类层次当中,当系统必须从其中的许多类型创建新对象时,可以考虑原型。