设计模式之------创建型模式(五)-----原型模式

本文通过实例详细介绍了Java中对象的深浅复制概念及其实现方式。浅复制仅复制基本类型并保留引用类型引用,而深复制则完全克隆对象包括其引用类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原型模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。

说道复制对象,我将结合对象的浅复制和深复制来说一下,首先需要了解对象深、浅复制的概念:

浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

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


对象深浅复制的例子:

package com.panther.demo.exercise9;

import java.io.*;

/**
 * 对象的深复制和浅复制
 * Created by panther.dongdong on 2016/3/15.
 */
public class Prototype implements Cloneable, Serializable {
    private static final long serialVersionUID = -3346888925332166469L;

    private String string;

    private SerializableObject serializableObject;

    //浅复制
    public Prototype clone() throws CloneNotSupportedException {
        Prototype prototype = (Prototype) super.clone();
        return prototype;
    }

    //深复制
    public Prototype deepClone() throws IOException, ClassNotFoundException {
        //写入当前对象的二进制流
        ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
        objectOutputStream.writeObject(this);

        //读出二进制流产生新对象
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteOutputStream.toByteArray());
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        return (Prototype) objectInputStream.readObject();
    }


    public String getString() {
        return string;
    }

    public void setString(String string) {
        this.string = string;
    }

    public SerializableObject getSerializableObject() {
        return serializableObject;
    }

    public void setSerializableObject(SerializableObject serializableObject) {
        this.serializableObject = serializableObject;
    }

    static class SerializableObject implements Serializable {

        private static final long serialVersionUID = -7728443971130605297L;
    }

    public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {
        Prototype prototype = new Prototype();
        prototype.setSerializableObject(new SerializableObject()); //设置引用类型对象
        Prototype prototype1 = prototype.clone(); //浅复制
        Prototype prototype2 = prototype.deepClone(); //深复制
        System.out.println(prototype.getSerializableObject() == prototype1.getSerializableObject()); //true
        System.out.println(prototype.getSerializableObject() == prototype2.getSerializableObject()); //false
    }

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值