我對(duì)于設(shè)計(jì)模式還是一知半解的,最近看了幾個(gè)設(shè)計(jì)模式,單例模式和工廠模式是比較基礎(chǔ)和簡(jiǎn)單的奴潘,這里我就不贅述了,但是他們是最為普遍的設(shè)計(jì)模式影钉,不了解的小伙伴們還是去看看為好画髓。https://www.runoob.com/design-pattern/design-pattern-tutorial.html
拷貝
關(guān)于拷貝,這篇文章寫(xiě)得特別好平委,深入淺出奈虾。
總結(jié)起來(lái)就是:類(lèi)初始化的過(guò)程比作打印,拷貝的過(guò)程比作復(fù)印廉赔。
類(lèi)加載的過(guò)程很復(fù)雜肉微,如果我們循環(huán)的使用new來(lái)初始化對(duì)象的話,對(duì)于性能的壓力是非常大的蜡塌。而拷貝對(duì)象不是重新創(chuàng)建一個(gè)對(duì)象碉纳,而是在內(nèi)存中進(jìn)行數(shù)據(jù)塊的拷貝,復(fù)制已有的對(duì)象馏艾。
淺拷貝
淺拷貝只拷貝你指定的對(duì)象劳曹,至于你指定的對(duì)象里面的別的對(duì)象,它不拷貝琅摩,還是把引用給你铁孵,共享變量,這是一種非常不安全的方式房资,需要特別注意蜕劝。
public class AAA implements Cloneable {
private BBB bbb = new BBB();
public void setName(String name) {
this.bbb.setName(name);
}
public String getName() {
return this.bbb.getName();
}
@Override
protected AAA clone(){
AAA aaa = null;
try {
aaa = (AAA) super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return aaa;
}
}
深拷貝
實(shí)現(xiàn)深拷貝,把指定的對(duì)象里面的對(duì)象實(shí)例化出來(lái)就可以了志膀。
public class AAA implements Cloneable {
private BBB bbb = new BBB();
public void setName(String name) {
this.bbb.setName(name);
}
public String getName() {
return this.bbb.getName();
}
@Override
protected AAA clone(){
AAA aaa = null;
try {
aaa = (AAA) super.clone();
aaa.bbb = new BBB();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return aaa;
}
}
原型模式
其實(shí)拷貝的過(guò)程就是原型模式,是用于創(chuàng)建重復(fù)的對(duì)象鳖擒,同時(shí)又能保證性能溉浙。
使用場(chǎng)景
1.在需要一個(gè)類(lèi)的大量對(duì)象的時(shí)候,使用原型模式是最佳選擇蒋荚,因?yàn)樵湍J绞窃趦?nèi)存中對(duì)這個(gè)對(duì)象進(jìn)行拷貝戳稽,要比直接new這個(gè)對(duì)象性能要好很多,在這種情況下,需要的對(duì)象越多惊奇,原型模式體現(xiàn)出的優(yōu)點(diǎn)越明顯互躬。
2.如果一個(gè)對(duì)象的初始化需要很多其他對(duì)象的數(shù)據(jù)準(zhǔn)備或其他資源的繁瑣計(jì)算,那么可以使用原型模式颂郎。
3.當(dāng)需要一個(gè)對(duì)象的大量公共信息吼渡,少量字段進(jìn)行個(gè)性化設(shè)置的時(shí)候,也可以使用原型模式拷貝出現(xiàn)有對(duì)象的副本進(jìn)行加工處理乓序。