原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
一 、 概述
原型模式是从一个对象出发得到一个和自己有相同状态的新对象的成熟模式,该模式的关键是将一个对象定义为原型,并为其提供复制自己的方法。
二、原型模式的结构与使用
模式的结构中包括两种角色:
1.抽象原型(Prototype):Prototype.java
public interface Prototype {
public Object cloneMe() throwsCloneNotSupportedException,;
}
2.具体原型(Concrete Prototype)_1:Cubic.java
public class Cubic implements Prototype, Cloneable{
double length,width,height;
Cubic(double a,doubleb,double c){
length=a;
width=b;
height=c;
}
public Object cloneMe() throws CloneNotSupportedException{
Cubicobject=(Cubic)clone();
returnobject;
}
}
2.具体原型(Concrete Prototype)_2:Goat.java
import java.io.*;
public class Goat implements Prototype,Serializable{
StringBuffer color;
public void setColor(StringBuffer c){
color=c;
}
public StringBuffergetColor(){
returncolor;
}
public Object cloneMe() throws CloneNotSupportedException{
Object object=null;
try{
ByteArrayOutputStreamoutOne=newByteArrayOutputStream();
ObjectOutputStreamoutTwo=newObjectOutputStream(outOne);
outTwo.writeObject(this);
ByteArrayInputStream inOne=
new ByteArrayInputStream(outOne.toByteArray());
ObjectInputStreaminTwo=newObjectInputStream(inOne);
object=inTwo.readObject();
}
catch(Exception event){
System.out.println(event);
}
returnobject;
}
}
3.应用 Application.java
public classApplication{
public static void main(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 exp){}
Goat goat=new Goat();
goat.setColor(newStringBuffer("白颜色的山羊"));
System.out.println("goat是"+goat.getColor());
try{
Goat goatCopy=(Goat)goat.cloneMe();
System.out.println("goatCopy是"+goatCopy.getColor());
System.out.println("goatCopy将自己的颜色改变成黑色");
goatCopy.setColor(newStringBuffer("黑颜色的山羊"));
System.out.println("goat仍然是"+goat.getColor());
System.out.println("goatCopy是"+goatCopy.getColor());
}
catch(CloneNotSupportedException exp){}
}
}
三、原型模式的优点