原型設(shè)計(jì)模式(六) - 深拷貝

前言

原型設(shè)計(jì)模式系列文章
原型設(shè)計(jì)模式(一) - 定義醇疼、訂單拆分
原型設(shè)計(jì)模式(二) - 訂單拆分一般寫法實(shí)現(xiàn)
原型設(shè)計(jì)模式(三) - 訂單拆分采用原型設(shè)計(jì)模式進(jìn)行改進(jìn)
原型設(shè)計(jì)模式(四) - 訂單拆分采用系統(tǒng)自帶的拷貝的方法實(shí)現(xiàn)
原型設(shè)計(jì)模式(五) - 淺拷貝
原型設(shè)計(jì)模式(六) - 深拷貝
原型設(shè)計(jì)模式(七) - 使用場(chǎng)景

1. 深拷貝


實(shí)現(xiàn)步驟蛀序,與淺拷貝差不多:
1>:創(chuàng)建用戶對(duì)象User溺欧,實(shí)現(xiàn)Cloneable讯检,復(fù)寫clone()方法谜酒;
2>:創(chuàng)建地址對(duì)象Address谨湘,實(shí)現(xiàn)Cloneable媳握,復(fù)寫clone()方法稠曼;
3>:然后在User中的 clone()方法中形病,對(duì)User對(duì)象和Address對(duì)象都進(jìn)行拷貝,目的是達(dá)到深拷貝霞幅;
4>:然后在測(cè)試客戶端 UserClient中測(cè)試漠吻,和淺拷貝測(cè)試代碼一樣,同樣是調(diào)用 user的clone()方法司恳,克隆User對(duì)象途乃,然后把拷貝的姓名和地址同時(shí)修改下;

下邊進(jìn)行效果演示

2. 代碼如下


1>:創(chuàng)建用戶對(duì)象User扔傅,實(shí)現(xiàn)Cloneable耍共,復(fù)寫clone()方法烫饼,在clone()方法中,對(duì)User對(duì)象和Address對(duì)象都進(jìn)行拷貝试读,目的是達(dá)到深拷貝:
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/3 8:02
 * Version 1.0
 * Params:
 * Description:    用戶的對(duì)象杠纵,實(shí)現(xiàn)Cloneable接口目的就是,讓User對(duì)象可以在UserClient中拷貝
*/

public class User implements Cloneable {

    // 用戶姓名
    public String userName ;
    // 用戶年齡
    public int age ;
    // 用戶地址
    public Address userAddress ;


    /**
     * 復(fù)寫克隆方法 clone()
     */
    @Override
    protected User clone() throws CloneNotSupportedException {
        // 克隆User對(duì)象
        User user = (User) super.clone() ;
        // 克隆Address對(duì)象钩骇,也就是說把類中的類對(duì)象也進(jìn)行一次拷貝比藻,達(dá)到深拷貝
        user.userAddress = userAddress.clone() ;
        return user;
    }
}
2>:創(chuàng)建地址對(duì)象Address,實(shí)現(xiàn)Cloneable倘屹,復(fù)寫clone()方法:
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/3 9:21
 * Version 1.0
 * Params:
 * Description:    地址
*/

public class Address implements Cloneable{
    public Address(String addressName, String city) {
        this.addressName = addressName;
        this.city = city;
    }

    public String addressName ;
    public String city ;

    @Override
    protected Address clone() throws CloneNotSupportedException {
        return (Address) super.clone();
    }
}
3>:然后在測(cè)試客戶端 UserClient中測(cè)試银亲,和淺拷貝測(cè)試代碼一樣,同樣是調(diào)用 user的clone()方法唐瀑,克隆User對(duì)象群凶,然后把拷貝的姓名和地址同時(shí)修改下:
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/3 9:21
 * Version 1.0
 * Params:
 * Description:    測(cè)試 - 深拷貝
*/

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

        User user = new User() ;
        user.userName = "Novate" ;
        user.age = 18 ;
        user.userAddress = new Address("陜西西安" , "西安") ;

        // 深拷貝
        try {
            // 對(duì)User進(jìn)行拷貝插爹,copyUser就是拷貝的對(duì)象
            User copyUser = user.clone() ;
            /*// 原始的User的姓名和地址  打印結(jié)果: 姓名:Novate, 地址:陜西西安
            System.out.println("姓名:" + user.userName + ", 地址:" + user.userAddress.addressName+"\n");
            // 拷貝的姓名和地址        打印結(jié)果: 姓名:Novate, 地址:陜西西安
            System.out.println("姓名:" + copyUser.userName + ", 地址:" + copyUser.userAddress.addressName);*/


            // 把拷貝的姓名和地址做下修改
            copyUser.userAddress.addressName = "北京" ;
            copyUser.userName = "王子文" ;
            // 姓名:Novate, 地址:北京
            System.out.println("姓名:" + user.userName + ", 地址:" + user.userAddress.addressName+"\n");
            // 姓名:王子文, 地址:北京
            System.out.println("姓名:" + copyUser.userName + ", 地址:" + copyUser.userAddress.addressName);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}
打印結(jié)果如下:
姓名:Novate, 地址:陜西西安
姓名:王子文, 地址:北京
注意:

這個(gè)效果是我們想要的哄辣,就是說:
1>:我們分別對(duì) 用戶對(duì)象User和地址對(duì)象Address進(jìn)行拷貝;
2>:然后在測(cè)試客戶端UserClient中赠尾,調(diào)用 user的clone()方法力穗,獲取拷貝對(duì)象copyUser,然后修改copyUser對(duì)象的姓名和地址气嫁,打印結(jié)果如上当窗,這個(gè)結(jié)果是正常的,因?yàn)槲覀冴?duì)姓名和地址分別進(jìn)行修改了寸宵,而打印出的結(jié)果也都是不一樣的崖面,這個(gè)就達(dá)到了深拷貝

3. 深拷貝定義?


深拷貝定義就是:把類中的類梯影、及類中的所有對(duì)象全部進(jìn)行拷貝巫员,叫做深拷貝;
這里就指的是把User類甲棍、及其內(nèi)部類Address對(duì)象全部進(jìn)行拷貝简识,達(dá)到深拷貝;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末感猛,一起剝皮案震驚了整個(gè)濱河市七扰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陪白,老刑警劉巖颈走,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異咱士,居然都是意外死亡立由,警方通過查閱死者的電腦和手機(jī)袖瞻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拆吆,“玉大人聋迎,你說我怎么就攤上這事≡嬉” “怎么了霉晕?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捞奕。 經(jīng)常有香客問我牺堰,道長(zhǎng),這世上最難降的妖魔是什么颅围? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任伟葫,我火速辦了婚禮,結(jié)果婚禮上院促,老公的妹妹穿的比我還像新娘筏养。我一直安慰自己,他們只是感情好常拓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布渐溶。 她就那樣靜靜地躺著,像睡著了一般弄抬。 火紅的嫁衣襯著肌膚如雪茎辐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天掂恕,我揣著相機(jī)與錄音拖陆,去河邊找鬼。 笑死懊亡,一個(gè)胖子當(dāng)著我的面吹牛依啰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斋配,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼孔飒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了艰争?” 一聲冷哼從身側(cè)響起坏瞄,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甩卓,沒想到半個(gè)月后鸠匀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逾柿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年缀棍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宅此。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爬范,死狀恐怖父腕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情青瀑,我是刑警寧澤璧亮,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站斥难,受9級(jí)特大地震影響枝嘶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哑诊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一群扶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镀裤,春花似錦竞阐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铃岔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間峭火,已是汗流浹背毁习。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卖丸,地道東北人纺且。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像稍浆,于是被迫代替她去往敵國(guó)和親载碌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容