美文网首页
原型模式——对象clone

原型模式——对象clone

作者: enjoy_CC | 来源:发表于2019-01-16 18:58 被阅读0次

Java中对象的clone可以通过Object中的clone()来实现,步骤如下:
1、实现cloneable接口(cloneable只代表一种能力,不需要重写任何方法)
2、重写clone方法,在方法中继承Object的clone方法即可(Object中clone()为protected,不能直接使用,当没有实现cloneable是会抛出CloneNotSupportedException)

需要注意的是,通过继承实现的clone为浅克隆,意思是虽然重新创建了一个当前对象,但这个对象里面的对象指向的都是同一个对象;如果需要深克隆可以通过序列化来实现。代码如下

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

public class Aa implements Cloneable,Serializable {
    private Bb d;//Bb为支持序列化功能的任意对象

    public Aa(String b, String c) {
        this.d=new Bb(b,c);
    }

    public Bb getD() {
        return d;
    }

    @Override
    public Aa clone(){
        Object o=null;
        try {
            o=super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return (Aa)o;
    }


    public Aa deepClone(){
        Object o=null;
        try {
            ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
            ObjectOutputStream objectOutputStream=new ObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(this);

            ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
            ObjectInputStream objectInputStream=new ObjectInputStream(byteArrayInputStream);
            o= objectInputStream.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (Aa)o;
    }
  public static void main(String [] args){
        Aa a=new Aa("a","b");
        Aa b=  a.clone();
        Aa c=  a.deepClone();
        System.out.println(a==b);//false
        System.out.println(a.getD()==b.getD());//true
        System.out.println(a==c);//false
        System.out.println(a.getD()==c.getD());//false
    }
}

相关文章

  • PHP 原型模式

    原型模式与工厂模式作用类似,都是用来创建对象,但不同的是原型模式是先创建好一个原型对象,然后通过clone原型对象...

  • php设计模式(七)原型模式

    原型模式 与工厂模式类似 与工厂模式实现不同,原型模式时先创建好一个原型对象,然后通过clone原型对象来创建新对...

  • php设计模式——原型模式

    原型模式 概念理解:原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。适用于大对象的创建,...

  • 1.3 创建型-原型模式

    原型模式应用场景:如果对象创建比较复杂,可以通过原型模式,使用clone的复制来创建新的对象 原型模式组成要素: ...

  • java设计模式--原型模式

    原型模式定义:用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象。 原型模式的核心是一个clone方...

  • 设计模式(五):原型模式

    原型模式(Prototype) 原型模式是通过clone 方法来实现对象创建而不是使用标准的new 方式。

  • 原型模式

    由于 Java 提供了对象的 clone() 方法,所以用 Java 实现原型模式很简单。 1. 模式的结构 原型...

  • 原型模式

    原型模式和迭代器模式,使用场景比较特殊,原型模式就是用来clone 对象的,假设对象很多属性要赋值,new 一个对...

  • 原型模式(Clone对象)

    原型模式:对象的复制, this.MemberwiseClone(); 只复制值类型,不复制引用类型。若要深度复制...

  • 原型模式——对象clone

    Java中对象的clone可以通过Object中的clone()来实现,步骤如下:1、实现cloneable接口(...

网友评论

      本文标题:原型模式——对象clone

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