净谦

导航

克隆模式-深浅克隆

 

package create.clone;

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

/**
 * 简单形式,深浅克隆
 *
 * 适用于需要创建的原型对象数目较少且比较固定的情况,原型对象的保存交由客户端负责
 * @author zhangchy
 *
 */

// 作为成员变量的A要序列化
class A implements Serializable{
 
}

//自己要被克隆的对象
class ProtoType implements Cloneable,Serializable{
 private A a = new A();
 //浅克隆
 public Object clone() throws CloneNotSupportedException{
  return super.clone();
 }
 public A getA() {
  return a;
 }
 public void setA(A a) {
  this.a = a;
 }
 
 // 利用流来处理,使自己被深克隆
 public Object deepClone(){
  Object object = null;
  try{
   //字节流写入
   ByteArrayOutputStream bo = new ByteArrayOutputStream();
   ObjectOutputStream oo = new ObjectOutputStream(bo);
            //this 必须能够序列化 ,保证所有的成员变量都能序列化
   oo.writeObject(this);
   
   //字节流写出
   ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
   ObjectInputStream oi = new ObjectInputStream(bi);
   object=oi.readObject();
  }
  catch(Exception e){
   e.printStackTrace();
  }
  return object;
 }
}

public class ClonePattern {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //克隆需要原型,protoType为原型
  ProtoType protoType = new ProtoType();
  ProtoType protoTypeClone = null;
  ProtoType protoTypeDeepClone = null;
  
  try{
            //进行浅克隆
    protoTypeClone = (ProtoType)protoType.clone();
    protoTypeDeepClone = (ProtoType)protoType.deepClone();
  }
  catch(CloneNotSupportedException cloneE){
   cloneE.printStackTrace();
  }
  
  //克隆了一个新对象
  System.out.println(protoType);
  System.out.println(protoTypeClone);
  System.out.println(protoTypeDeepClone);
  //下面中两个方法获得的getA对象是同一个地址,所以浅克隆不能创建一个成员变量的新对象,
  //创建一个成员新对象,那么就需要对自己进行深克隆
  System.out.println(protoType.getA());
  System.out.println(protoTypeClone.getA());
  //深克隆后,
  System.out.println(protoTypeDeepClone.getA());
 }

}

 

posted on 2012-03-19 10:10  康安V  阅读(368)  评论(0)    收藏  举报