Prototype模式是一种对象创建型模式,它跟工厂模式,Builder模式等一样,都用来创建类的实例对象。
但Prototype模式的对象创建方法,具有以下特点:
- 由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
- 目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。
- 根据对象克隆深度层次的不同,有浅度克隆与深度克隆。
有关Java语言克隆技术的描述,请参考:
Java语言的克隆与深层次克隆技术入门与精通
一文。
简单一点说,
Prototype模式提供一种方法,让类的对象可以实现对自身的复制。
- 在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。
- 希望对目标对象的修改不影响既有的原型对象(深度克隆的时候可以完全互不影响)。
- 隐藏克隆操作的细节。很多时候,对对象本身的克隆需要涉及到类本身的数据细节。
现实生活中,就有许多这样的例子:
生物细胞的自身复制;根据产品模型生产产品等等
Prototype {
+clone():Prototype
}
即:原型类Prototype 提供clone()方法,实现对对象自身的复制(克隆)。
UML类图:
下面我们使用Prototype模式来实现细胞(Cell)的自身复制过程。
Java语言提供了对象复制的机制,Prototype模式的Java实现一般也通过实现Cloneable接口来实现。
这里我们也通过实现Cloneable接口来说明Prototype模式。
- public class Cell implements Cloneable {
- //细胞壁
- private String cellWall;
- //细胞膜
- private String cellMembrane;
- //细胞组织
- private String cellularTissue;
- ...//这里省略掉了对成员变量的setter/getter方法的定义
- //细胞的自身复制
- //这里重载了Obect#clone()方法,为了方便外部调用,把返回值由Object修改为Cell,并把访问级别设置为public
- <strong> public Cell clone() {
- try {
- //只需简单地调用super.clone();即可
- return (Cell) super .clone();
- } catch (CloneNotSupportedException e) {
- throw ( new InternalError(e.getMessage()));
- }
- }
- </strong>
- }
- //调用方:
- public class Client {
- public static void main(String[] args) {
- //准备原型细胞
- Cell cell = new Cell();
- cell.setCellWall("cell wall 1" );
- ...
- //克隆原型细胞
- Cell clonedCell = cell.clone();
- ...
- //操作被克隆的细胞(略)
- }
- }
public class Cell implements Cloneable {
//细胞壁
private String cellWall;
//细胞膜
private String cellMembrane;
//细胞组织
private String cellularTissue;
...//这里省略掉了对成员变量的setter/getter方法的定义
//细胞的自身复制
//这里重载了Obect#clone()方法,为了方便外部调用,把返回值由Object修改为Cell,并把访问级别设置为public
public Cell clone() {
try {
//只需简单地调用super.clone();即可
return (Cell)super.clone();
} catch (CloneNotSupportedException e) {
throw (new InternalError(e.getMessage()));
}
}
}
//调用方:
public class Client {
public static void main(String[] args) {
//准备原型细胞
Cell cell = new Cell();
cell.setCellWall("cell wall 1");
...
//克隆原型细胞
Cell clonedCell = cell.clone();
...
//操作被克隆的细胞(略)
}
}
这里使用了一个简单的例子说明了Prototype模式的对象创建过程与方法。里面省略了某些无关紧要的代码。
有关对象的克隆与深度克隆的详细描述,我们在 Java语言的克隆与深层次克隆技术入门与精通 一文中作了详细描述,请加以参考。