原型模式 可以理解爲深複製對象,之前開發的時候自己經常用,但是不知道它還有這個名字。
簡答示例:
類中有一個 複製對象的方法。
/**
* 訂單對象
*/
public class OrderObject {
private String id;//訂單id
private String name;//訂單名
private double price;//價格
/**
* 複製訂單 原型模式
*/
public OrderObject cloneOrder(){
OrderObject orderObject = new OrderObject();
orderObject.setId(this.getId());
orderObject.setName(this.getName());
orderObject.setPrice(this.getPrice());
return orderObject;
}
//getter and setter
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
測試方法:
public static void main(String[] args) {
OrderObject object1 = new OrderObject();
object1.setId("123");
object1.setPrice(12.12);
object1.setName("訂單名");
OrderObject object2 = object1.cloneOrder();
object2.setPrice(object1.getPrice() + 10);
System.out.println("object1:"+object1 +" 價格:"+object1.getPrice());
System.out.println("object2:"+object2 +" 價格:"+object2.getPrice());
}
運行結果:
object1:com.teligen.dazt.learn.design.prototype.OrderObject@52cc8049 價格:12.12
object2:com.teligen.dazt.learn.design.prototype.OrderObject@5b6f7412 價格:22.119999999999997
上述的複製邏輯有點複雜,我們可以寫一個萬能的複製方法,但是類需要可序列化。
複製方法如下:
ReflexUtil.java 下的方法
/**
* 基於流的深複製
* @param t 要複製的對象
* @param <T> 類型
*/
public static <T> T cloneObject(T t){
ByteArrayOutputStream bos = null;
ObjectOutputStream oos = null;
try {
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(t);
oos.flush();
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
T cloneT = (T) ois.readObject();
return cloneT;
}catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(bos != null){
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(oos != null){
oos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
使用方法:
1:對象需要可序列化
public class OrderObject implements Serializable {...}
2:測試
OrderObject orderObject = new OrderObject();
orderObject.setId("123");
orderObject.setName("訂單123");
orderObject.setPrice(10.1);
OrderObject orderObject2 = ReflexUtil.cloneObject(orderObject);
System.out.println(orderObject +" name:"+orderObject.getName());
System.out.println(orderObject2+" name:"+orderObject2.getName());
測試結果:
com.teligen.dazt.learn.design.prototype.OrderObject@3941a79c name:訂單123
com.teligen.dazt.learn.design.prototype.OrderObject@133314b name:訂單123