创建型模式 --- 原型模式

2019-12-18  本文已影响0人  十二找十三

浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。

package test1;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Demo1 {
    public static void main(String[] args) throws Exception {
        Obj obj = new Obj();
        obj.setaString("aaa");
        KKK kkk = new KKK();
        kkk.setAaa("sss");
        obj.setKkk(kkk);

        Obj obj2 = (Obj) obj.clone();//deepClone()

        System.out.println("obj===" + obj);
        System.out.println("obj2===" + obj2);

        obj2.getKkk().setAaa("bbb");
        System.out.println("obj===" + obj);
        System.out.println("obj2===" + obj2);
    }
}

class Obj implements Cloneable, Serializable {
    private String aString;
    private KKK kkk;

    public Obj() {
        System.out.println("Obj()");
    }

    public String getaString() {
        return aString;
    }

    public void setaString(String aString) {
        this.aString = aString;
    }

    public KKK getKkk() {
        return kkk;
    }

    public void setKkk(KKK kkk) {
        this.kkk = kkk;
    }

    @Override
    public String toString() {
        return "Obj [aString=" + aString + ", kkk=" + kkk + "]";
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
        
    //深拷贝
    protected Object deepClone() {

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            ObjectOutputStream ooStream = new ObjectOutputStream(bos);
            ooStream.writeObject(this);

            ooStream.close();

            byte[] bb = bos.toByteArray();
            InputStream inputStream = new ByteArrayInputStream(bb);
            ObjectInputStream oisInputStream = new ObjectInputStream(inputStream);

            Object clone = oisInputStream.readObject();

            oisInputStream.close();

            return clone;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

class KKK implements Serializable {
    private String aaa;

    public String getAaa() {
        return aaa;
    }

    public void setAaa(String aaa) {
        this.aaa = aaa;
    }

    @Override
    public String toString() {
        return "KKK [aaa=" + aaa + "]";
    }
}

浅拷贝

package test;

public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        TempObject tempObject = new TempObject();
        tempObject.setProperties1("1");
        tempObject.setProperties2("1");
        
        Obj obj = new Obj();
        obj.setAaa(1);
        obj.setBbb(tempObject);
        
        
        Obj obj2 = (Obj)obj.clone();
        
        System.out.println("first print:" + obj2);
        
        tempObject.setProperties1("2");
        System.out.println("final print:" + obj2);
    }
}

class Obj implements Cloneable {
    private int aaa;
    private TempObject bbb;
    
    

    public int getAaa() {
        return aaa;
    }



    public void setAaa(int aaa) {
        this.aaa = aaa;
    }



    public TempObject getBbb() {
        return bbb;
    }



    public void setBbb(TempObject bbb) {
        this.bbb = bbb;
    }


    
    @Override
    public String toString() {
        return "Obj [aaa=" + aaa + ", bbb=" + bbb + "]";
    }



    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

class TempObject {
    private String properties1;
    private String properties2;

    public String getProperties1() {
        return properties1;
    }

    public void setProperties1(String properties1) {
        this.properties1 = properties1;
    }

    public String getProperties2() {
        return properties2;
    }

    public void setProperties2(String properties2) {
        this.properties2 = properties2;
    }

    @Override
    public String toString() {
        return "TempObject [properties1=" + properties1 + ", properties2=" + properties2 + "]";
    }
    
}
上一篇 下一篇

猜你喜欢

热点阅读