1. Prototype 声明一个克隆自身的接口。
2. ConcretePrototype 实现一个克隆自身的操作。
3. Client 让一个原型克隆自身从而创建一个新的对象。
原型模式的结构与使用
模式的结构中包括两种角色:
•抽象原型(Prototype)
•具体原型(Concrete Prototype)
模式的UML类图:
实战部分
【例1】:实现一个克隆接口,然后实现一个克隆自身的操作并加以应用
1.抽象原型(Prototype): Prototype.java
public interfacePrototype {public Object cloneMe() throwsCloneNotSupportedException;
}
2.具体原型(Concrete Prototype)_1:Cubic.java
public class Cubic implementsPrototype, Cloneable{doublelength, width, height;
Cubic(double a, double b, doublec){
length= a;
width= b;
height= c;
}public Object cloneMe() throwsCloneNotSupportedException{
Cubic object= (Cubic)clone();returnobject;
}
}
2.具体原型(Concrete Prototype)_2 : Goat.java
import java.io.*;public class Goat implementsPrototype,Serializable{
StringBuffer color;public voidsetColor(StringBuffer c){
color= c;
}publicStringBuffer getColor(){returncolor;
}public Object cloneMe() throwsCloneNotSupportedException{
Object object= null;try{
ByteArrayOutputStream outOne= newByteArrayOutputStream();
ObjectOutputStream outTwo= newObjectOutputStream(outOne);
outTwo.writeObject(this);
ByteArrayInputStream inOne=
newByteArrayInputStream(outOne.toByteArray());
ObjectInputStream inTwo= newObjectInputStream(inOne);
object=inTwo.readObject();
}catch(Exception event){
System.out.println(event);
}returnobject;
}
}
3.应用 Application.java
public classApplication {public static voidmain(String[] args) {
Cubic cubic= new Cubic(12, 20, 66);
System.out.println("cubic的长、宽和高: ");
System.out.println(cubic.length+ "," + cubic.width + "," +cubic.height);try{
Cubic cubicCopy=(Cubic)cubic.cloneMe();
System.out.println("cubicCopy的长、宽和高: ");
System.out.println(cubicCopy.length+ "," + cubicCopy.width + "," +cubicCopy.height);
}catch(CloneNotSupportedException ex){}
Goat goat= newGoat();
goat.setColor(new StringBuffer("白色的山羊"));
System.out.println("goat是" +goat.getColor());try{
Goat goatCopy=(Goat)goat.cloneMe();
System.out.println("goatCopy是" +goatCopy.getColor());
System.out.println("goatCopy将自己的颜色改变成黑色");
goatCopy.setColor(new StringBuffer("黑颜色的山羊"));
System.out.println("goat仍然是"+goat.getColor());
System.out.println("goatCopy是"+goatCopy.getColor());
}catch(CloneNotSupportedException ex){}
}
}
原型模式的优点
•当创建类的新实例的代价更大时,使用原型模式复制一个已有的实例可以提高创建新实例的效率。
•可以动态地保存当前对象的状态。在运行时刻,可以随时使用对象流保存当前对象的一个复制品。