原型模式的注意事項(xiàng)和細(xì)節(jié)
- 創(chuàng)建新的對(duì)象比較復(fù)雜時(shí),可以利用原型模式簡(jiǎn)化對(duì)象的創(chuàng)建過(guò)程,同時(shí)也能夠提 高效率
- 不用重新初始化對(duì)象,而是動(dòng)態(tài)地獲得對(duì)象運(yùn)行時(shí)的狀態(tài)
- 如果原始對(duì)象發(fā)生變化(增加或者減少屬性),其它克隆對(duì)象的也會(huì)發(fā)生相應(yīng)的變化, 無(wú)需修改代碼
- 在實(shí)現(xiàn)深克隆的時(shí)候可能需要比較復(fù)雜的代碼
- 缺點(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
}
}