前言
原型設(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á)到深拷貝;