拷貝與原型模式

我對于設(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)有對象的副本進行加工處理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容