java-設計模式-原型模式-基於流的複製

原型模式 可以理解爲深複製對象,之前開發的時候自己經常用,但是不知道它還有這個名字。

簡答示例:

類中有一個 複製對象的方法。


/**
 * 訂單對象
 */
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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章