原型模式
一、題目:
某數據處理軟件需要增加一個圖表複製功能。在圖表對象(DataChart)中包含一個數據集對象(DataSet)。數據集對象用於封裝要顯示的數據,用戶可以通過界面上的複製按鈕將該圖表複製一份,複製後,即可得到新的圖表對象,然後可以修改新圖表的編號、顏色、數據。試用原型模式設計軟件實現深克隆。
(1)給出原型模式等結構視圖
(2)給出該實例等類圖及代碼實現
二、所用模式結構視圖:
三、實例類圖:
四、實例實現代碼:
(因爲區分,所以在類的前面加了Gj19)
圖表對象Gj19DataChart:
package Prototype;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.io.Serializable;
/**
* 圖表對象
* @author gong
*
*/
public class Gj19DataChart implements Serializable{
/**
*
*/
private static final long serialVersionUID = 3672368913840301016L;
private DataSet ds = new DataSet();
public int number; //編號
public String color; //顏色
public int data; //數據
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public DataSet getDs() {
return ds;
}
public void setDs(DataSet ds) {
this.ds = ds;
}
@Override
public String toString() {
return "Gj19DataChart [number=" + number + ", color=" + color
+ ", data=" + data + "]";
}
//使用序列化技術實現深克隆
public Gj19DataChart deepClone() throws IOException, ClassNotFoundException, OptionalDataException
{
//將對象寫入流中
ByteArrayOutputStream bao=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bao);
oos.writeObject(this);
//將對象從流中取出
ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bis);
return (Gj19DataChart)ois.readObject();
}
}
DateSet數據流對象:
package Prototype;
import java.io.Serializable;
/**
* DateSet數據流對象
* @author gong
*
*/
public class DataSet implements Serializable{
/**
*
*/
private static final long serialVersionUID = -4833027480140156492L;
public int number; //編號
public String color; //顏色
public int data; //數據
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
}
客戶端測試原型模式:
package Prototype;
//測試原型模式
public class Client {
public static void main(String args[])
{
Gj19DataChart datachart1, datachart2 = null;
datachart1 = new Gj19DataChart(); //創建原型對象
try
{
datachart2 = datachart1.deepClone(); //調用深克隆方法創建克隆對象
}
catch(Exception e){
System.out.println("克隆失敗!");
}
System.out.println(datachart1==datachart2);
System.out.println(datachart1.getDs()==datachart2.getDs());
System.out.println(datachart1.getColor()==datachart2.getColor());
}
}
五、運行結果: