原型模式——对象clone

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
    }
}

你可能感兴趣的:(原型模式——对象clone)