美文网首页
创建型模式 --- 原型模式

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

作者: 十二找十三 | 来源:发表于2019-12-18 11:17 被阅读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 + "]";
    }
    
}

相关文章

  • PHP常用设计模式

    # 创建型 单例模式 工厂模式 工厂抽象模式 原型模式 建造者模式 # 结构型 # 行为型 # 3.注册模式 # ...

  • 创建型设计模式——原型模式

    定义 原型模式是一个创建型的设计模式。用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。原型模式多用于...

  • 原型模式

    个人博客http://www.milovetingting.cn 原型模式 模式介绍 原型模式是一个创建型的模式。...

  • 三、原型模式

    原型模式用于创建重复对象的同时保持性能,该模式属于创建型设计模式,是创建对象的最佳实现方式。 为什么要使用原型模式...

  • 初始设计模式之原型模式

    原型模式是什么? 原型模式怎么用?浅拷贝深拷贝 原型模式再理解 一、原型模式是什么? ​ 原型模式是一种创建型设计...

  • 设计模式[4]-原型模式-Prototype Pattern

    1. 原型模式简介 原型模式(Prototype Pattern)是创建型设计模式,根据一个原型对象,通过Clon...

  • S3. 原型模式

    原型模式(Prototype) baidu[www.baidu.com] 原型模式是一种创建型设计模式,其功能为复...

  • Objective-C 原型模式 -- 简单介绍和使用

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype原型模式是一种创建型设计模式,P...

  • 设计模式最佳实践之原型模式

    What 原型模式:是一个创建型的模式。用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 使用场景:...

  • 设计模式小结

    设计模式 7 大原则 创建型 单例模式 原型模式 创建者模式(生成器模式) 简单工厂模式 工厂方法模式 抽象工厂模...

网友评论

      本文标题:创建型模式 --- 原型模式

      本文链接:https://www.haomeiwen.com/subject/angynctx.html