我對于設(shè)計模式還是一知半解的,最近看了幾個設(shè)計模式,單例模式和工廠模式是比較基礎(chǔ)和簡單的,這里我就不贅述了,但是他們是最為普遍的設(shè)計模式,不了解的小伙伴們還是去看看為好。https://www.runoob.com/design-pattern/design-pattern-tutorial.html
拷貝
關(guān)于拷貝,這篇文章寫得特別好,深入淺出。
總結(jié)起來就是:類初始化的過程比作打印,拷貝的過程比作復(fù)印。
類加載的過程很復(fù)雜,如果我們循環(huán)的使用new來初始化對象的話,對于性能的壓力是非常大的。而拷貝對象不是重新創(chuàng)建一個對象,而是在內(nèi)存中進行數(shù)據(jù)塊的拷貝,復(fù)制已有的對象。
淺拷貝
淺拷貝只拷貝你指定的對象,至于你指定的對象里面的別的對象,它不拷貝,還是把引用給你,共享變量,這是一種非常不安全的方式,需要特別注意。
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;
}
}
深拷貝
實現(xiàn)深拷貝,把指定的對象里面的對象實例化出來就可以了。
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;
}
}
原型模式
其實拷貝的過程就是原型模式,是用于創(chuàng)建重復(fù)的對象,同時又能保證性能。
使用場景
1.在需要一個類的大量對象的時候,使用原型模式是最佳選擇,因為原型模式是在內(nèi)存中對這個對象進行拷貝,要比直接new這個對象性能要好很多,在這種情況下,需要的對象越多,原型模式體現(xiàn)出的優(yōu)點越明顯。
2.如果一個對象的初始化需要很多其他對象的數(shù)據(jù)準(zhǔn)備或其他資源的繁瑣計算,那么可以使用原型模式。
3.當(dāng)需要一個對象的大量公共信息,少量字段進行個性化設(shè)置的時候,也可以使用原型模式拷貝出現(xiàn)有對象的副本進行加工處理。