15.原型模式-深拷貝-序列化

原型模式的注意事項(xiàng)和細(xì)節(jié)

  1. 創(chuàng)建新的對(duì)象比較復(fù)雜時(shí),可以利用原型模式簡(jiǎn)化對(duì)象的創(chuàng)建過(guò)程,同時(shí)也能夠提 高效率
  2. 不用重新初始化對(duì)象,而是動(dòng)態(tài)地獲得對(duì)象運(yùn)行時(shí)的狀態(tài)
  3. 如果原始對(duì)象發(fā)生變化(增加或者減少屬性),其它克隆對(duì)象的也會(huì)發(fā)生相應(yīng)的變化, 無(wú)需修改代碼
  4. 在實(shí)現(xiàn)深克隆的時(shí)候可能需要比較復(fù)雜的代碼
  5. 缺點(diǎn):需要為每一個(gè)類(lèi)配備一個(gè)克隆方法,這對(duì)全新的類(lèi)來(lái)說(shuō)不是很難,但對(duì)已有 的類(lèi)進(jìn)行改造時(shí),需要修改其源代碼,違背了ocp原則,這點(diǎn)請(qǐng)同學(xué)們注意

沈拷貝之序列化拷貝

復(fù)制一個(gè)對(duì)象,連帶屬性的值復(fù)制出來(lái),屬性如果是引用類(lèi)型,那么是一個(gè)地址,用了另外的空間。

一次代碼終生使用【極薦】

代碼實(shí)現(xiàn)(原型是重點(diǎn))

原型類(lèi)

package com.yuan.dp.prototype.domain;

import java.io.*;

public class Chicken implements Serializable {
     String name;
     String hobby;
     Friend friend;

    public Chicken(String name, String hobby, Friend friend) {
        this.name = name;
        this.hobby = hobby;
        this.friend = friend;
    }

    @Override
    public String toString() {
        return "Chicken{" +
                "name='" + name + '\'' +
                ", hobby='" + hobby + '\'' +
                ", friend=" + friend.hashCode() +
                '}';
    }

    /**
     * 第2種 深拷貝方法 【序列化】
     *
     * @return
     */
    @Override
    public Chicken clone() {
        ByteArrayOutputStream bos;
        ByteArrayInputStream bis;
        ObjectOutputStream oos;
        ObjectInputStream ois;
        try {
            //序列化
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            //當(dāng)前對(duì)象以流的方式輸出【一次將本類(lèi)相關(guān)的所有類(lèi)型都拿過(guò)來(lái),再多的屬性也不變代碼】
            oos.writeObject(this);
            //反序列化
            bis = new ByteArrayInputStream(bos.toByteArray());
            ois = new ObjectInputStream(bis);
            Chicken chicken = (Chicken) ois.readObject();
            return chicken;
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        } finally {
            //關(guān)流
        }
    }
}

引用類(lèi)型屬性類(lèi)

package com.yuan.dp.prototype.domain;

import java.io.Serializable;

public class Friend implements Cloneable, Serializable {
    public String name ;
    public String hobby ;

    /**
     * 如果沒(méi)有引用類(lèi)型 就用淺拷貝 默認(rèn)的
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    protected Friend clone() throws CloneNotSupportedException {
        Friend friend = (Friend) super.clone();
        return friend;
    }
}

測(cè)試

package com.yuan.dp.prototype;

import com.yuan.dp.prototype.domain.Chicken;
import com.yuan.dp.prototype.domain.Friend;

public class Prototype_3 {
    public static void main(String[] args) {

        Friend friend = new Friend();

        Chicken chicken_1 = new Chicken("小紅", "睡覺(jué)", friend);
        System.out.println("chicken_1 = " + chicken_1);
        //chicken_1 = Chicken{name='小紅', hobby='睡覺(jué)', friend=42121758}
        Chicken chicken_2 = chicken_1.clone();
        System.out.println("chicken_2 = " + chicken_2);
        //chicken_2 = Chicken{name='小紅', hobby='睡覺(jué)', friend=1810132623}
        System.out.println(chicken_1 == chicken_2);
        //false
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容