原型模式
原型模式是在已指定對象的基礎上,然后通過拷貝這些原型對象創建新的對象。
原型模式有兩個組成部份
1.抽象原型
2.具體原型
例子:
1.抽象原型
package prototype;

/**
* <ul>
* <li>Title:[Prototype]</li>
* <li>Description: [抽象原型]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public interface Prototype
{
/**
* <ul>
* <li>Description:[原型接口聲明]</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @return
* @throws CloneNotSupportedException
*/
public Object cloneMe() throws CloneNotSupportedException;
}
2.具體原型1
package prototype;

/**
* <ul>
* <li>Title:[Circle]</li>
* <li>Description: [圓類]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @version 1.0
*/
public class Circle implements Prototype, Cloneable
{
/** 半徑 */
private double radius;
/**
* <ul>
* <li>Description:[構造方法]</li>
* <ul>
*
* @param radius
*/
public Circle(double radius)
{
this.radius = radius;
}
/* (non-Javadoc)
* @see prototype.Prototype#cloneMe()
*/
public Object cloneMe() throws CloneNotSupportedException
{
Circle obj = (Circle)clone();
return obj;
}
public double getRadius()
{
return radius;
}
public void setRadius(double radius)
{
this.radius = radius;
}
}

3.具體原型2
package prototype;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
* <ul>
* <li>Title:[Triangle]</li>
* <li>Description: [三角形,用序列化的方式復制]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @version 1.0
*/
@SuppressWarnings("serial")
public class Triangle implements Prototype, Serializable
{
/** a邊 */
private double a;
/** b邊 */
private double b;
/** c邊 */
private double c;
/**
* <ul>
* <li>Description:[測試信息]</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public void getDebugInfo()
{
StringBuffer debuginfo = new StringBuffer();
debuginfo.append("原實例三邊信息-> ");
debuginfo.append("a:").append(a).append(", ");
debuginfo.append("b:").append(a).append(", ");
debuginfo.append("c:").append(a);
System.out.println(debuginfo);
}
/* (non-Javadoc)
* @see prototype.Prototype#cloneMe()
*/
public Object cloneMe() throws CloneNotSupportedException
{
Object obj = 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);
obj = inTwo.readObject();
}
catch(Exception ex)
{
ex.printStackTrace();
}
return obj;
}
public double getA()
{
return a;
}
public void setA(double a)
{
this.a = a;
}
public double getB()
{
return b;
}
public void setB(double b)
{
this.b = b;
}
public double getC()
{
return c;
}
public void setC(double c)
{
this.c = c;
}
}

4.測試類
package prototype;


/**
* <ul>
* <li>Title:[Test]</li>
* <li>Description: [測試類]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class Test
{
public static void main(String[] args) throws CloneNotSupportedException
{
Circle circle = new Circle(10);
System.out.println("原實例半徑: " + circle.getRadius());
Circle copyCircle = (Circle)circle.cloneMe();
System.out.println("復制例半徑: " + copyCircle.getRadius());
copyCircle.setRadius(20);
System.out.println("原實例半徑: " + circle.getRadius());
System.out.println("復制例半徑: " + copyCircle.getRadius());
Triangle triangle = new Triangle();
triangle.setA(10);
triangle.setB(20);
triangle.setC(30);
triangle.getDebugInfo();
Triangle copyTriangle = (Triangle)triangle.cloneMe();
copyTriangle.getDebugInfo();
copyTriangle.setA(11);
copyTriangle.setB(21);
copyTriangle.setC(31);
copyTriangle.getDebugInfo();
}
}

總結:原型模式在生成復雜對象比較苦難的環境中比較適用,通過克隆已有對象來實現創建新的對象,節省了時間和空間。
原型模式是在已指定對象的基礎上,然后通過拷貝這些原型對象創建新的對象。
原型模式有兩個組成部份
1.抽象原型
2.具體原型
例子:
1.抽象原型














































































3.具體原型2







































































































4.測試類









































總結:原型模式在生成復雜對象比較苦難的環境中比較適用,通過克隆已有對象來實現創建新的對象,節省了時間和空間。