传统拷贝
/**
* <p>Title: Sheep.java</p>
* <p>Description: </p>
* <p>Copyright:</p>
* <p>Company:</p>
* @author kansir
* @date 2019��8��15��
* @version 1.0
*/
package com.pro.prototype;
/**
* @Description
* @author kansir
* @version
* @date 2019��8��15�� ����10:49:39
*/
public class Sheep {
@Override
public String toString() {
return "Sheep [name=" + name + ", color=" + color + ", age=" + age + "]";
}
private String name;
private String color;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Sheep(String name, String color, int age) {
super();
this.name = name;
this.color = color;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
/**
* <p>Title: Client.java</p>
* <p>Description: </p>
* <p>Copyright:</p>
* <p>Company:</p>
* @author kansir
* @date 2019��8��15��
* @version 1.0
*/
package com.pro.prototype;
/**
* @Description
* @author kansir
* @version
* @date 2019��8��15�� ����10:51:27
*/
public class Client {
public static void main(String[] args) {
//��ͳ����
Sheep sheep=new Sheep("tom", "��ɫ", 1);
Sheep sheep2=new Sheep("tom", "��ɫ", 1);
Sheep sheep3=new Sheep("tom", "��ɫ", 1);
Sheep sheep4=new Sheep("tom", "��ɫ", 1);
System.out.println(sheep2);
System.out.println(sheep3);
System.out.println(sheep4);
}
}
原型模式
package com.pro.prototype.improve;
/**
*
* @ClassName: Sheep
* @Description: TODO(这里用一句话描述这个类的作用)
* @author kansir
* @date 2019年8月17日 下午9:48:45
*
*/
public class Sheep implements Cloneable{
private String name;
private String color;
public Sheep getFriend() {
return friend;
}
public void setFriend(Sheep friend) {
this.friend = friend;
}
private int age;
public Sheep friend; //克隆时,对象类型如何处理
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Sheep(String name, String color, int age) {
super();
this.name = name;
this.color = color;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Sheep [name=" + name + ", color=" + color + ", age=" + age + "]";
}
@Override
protected Object clone() {
Sheep sheep=null;
try {
sheep=(Sheep) super.clone();
return sheep;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
public Sheep() {
super();
}
}
/**
* <p>Title: Client.java</p>
* <p>Description: </p>
* <p>Copyright:</p>
* <p>Company:</p>
* @author kansir
* @date 2019��8��15��
* @version 1.0
*/
package com.pro.prototype.improve;
public class Client {
public static void main(String[] args) {
Sheep sheep = new Sheep("tom", "白色", 1);
Sheep sheep6 = new Sheep("jack", "黑色", 2);
sheep.setFriend(sheep6);
Sheep sheep2 = (Sheep) sheep.clone();
Sheep sheep3 = (Sheep) sheep.clone();
Sheep sheep4 = (Sheep) sheep.clone();
Sheep sheep5 = (Sheep) sheep.clone();
System.out.println(sheep2);
System.out.println(sheep3);
System.out.println(sheep4);
System.out.println("sheep5 = " + sheep5 + "sheep6.friend" + sheep5.friend.hashCode());
System.out.println("sheep5 = " + sheep6 + "sheep6" + sheep6.hashCode());
}
}
package com.pro.prototype.deepclone;
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
DeepProtoType p = new DeepProtoType();
p.setName("宋江");
p.setDeepCloneableTarget(new DeepCloneableTarget("大牛", "牛奶"));
/*
// 方式一 完成深拷贝
DeepProtoType p2 = (DeepProtoType) p.clone();
System.out.println("p.name" + p.getName() + "p.getDeepCloneableTarget().hashCode()"
+ p.getDeepCloneableTarget().hashCode());
System.out.println("p2.name" + p2.getName() + "p2.getDeepCloneableTarget().hashCode()"
+ p2.getDeepCloneableTarget().hashCode());
*/
// 方式二 完成深拷贝
DeepProtoType p2 = (DeepProtoType) p.deepClone();
System.out.println("p.name" + p.getName() + "p.getDeepCloneableTarget().hashCode()"
+ p.getDeepCloneableTarget().hashCode());
System.out.println("p2.name" + p2.getName() + "p2.getDeepCloneableTarget().hashCode()"
+ p2.getDeepCloneableTarget().hashCode());
}
}
package com.pro.prototype.deepclone;
import java.io.Serializable;
public class DeepCloneableTarget implements Serializable, Cloneable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String cloneName;
private String cloneClass;
/**
*
* <p>Title: </p>
* <p>Description: 构造器</p>
* @param cloneName
* @param cloneClass
*/
public DeepCloneableTarget(String cloneName, String cloneClass) {
this.cloneName = cloneName;
this.cloneClass = cloneClass;
}
/**
* 使用默认的克隆即可
*/
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
package com.pro.prototype.deepclone;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class DeepProtoType implements Serializable, Cloneable {
private String name;
private DeepCloneableTarget deepCloneableTarget;
public DeepProtoType() {
super();
}
// 深拷贝,方式一 :使用clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
Object deep = null;
// 完成对基本数据类型和属性的string的克隆
deep = super.clone();
// 对引用类型的属性进行单独处理
DeepProtoType deepProtoType = (DeepProtoType) deep;
deepProtoType.deepCloneableTarget = (DeepCloneableTarget) deepCloneableTarget.clone();
return deep;
}
// 深拷贝,方式二:通过序列化实现(推荐使用)
public Object deepClone() {
// 创建流对象
ByteArrayOutputStream bos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bis = null;
ObjectInputStream ois = null;
try {
// 序列化
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(this);// 将当前对象以对象流的形式输出
// 反序列化
bis = new ByteArrayInputStream(bos.toByteArray());
ois = new ObjectInputStream(bis);
DeepProtoType copeObj = (DeepProtoType) ois.readObject();
return copeObj;
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
bos.close();
bis.close();
oos.close();
ois.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return null;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public DeepCloneableTarget getDeepCloneableTarget() {
return deepCloneableTarget;
}
public void setDeepCloneableTarget(DeepCloneableTarget deepCloneableTarget) {
this.deepCloneableTarget = deepCloneableTarget;
}
}