名称:原型设计模式
作用:创建内部属性相同的对象
种类:
1:浅拷贝:内部的值类型和字符串类型都可以复制成功
方式:实现Cloneable接口,实现clone方法
2:深拷贝:除了内部的值类型和字符串类型,引用类型也能复制成功
方式:
1、实现Cloneable接口,实现clone方法
2、序列化
浅拷贝(实现Cloneable接口,实现clone方法)
package com.prototype;
/**
* dz����
* @author zonkin
*
*/
public class User1 implements Cloneable{
private String name;
private Integer age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public User1(String name, Integer age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "User1 [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
@Override
public Object clone() throws CloneNotSupportedException {
User1 user = null;
user = (User1)super.clone();
return user;
}
}
深拷贝(实现Cloneable接口,实现clone方法)
package com.prototype;
/**
* ���
* ʵ��clone����
* @author zonkin
*
*/
public class User2 implements Cloneable{
private String name;
private Integer age;
private String sex;
private Dog dog;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public User2(String name, Integer age, String sex, Dog dog) {
super();
this.name = name;
this.age = age;
this.sex = sex;
this.dog = dog;
}
@Override
public String toString() {
return "User2 [name=" + name + ", age=" + age + ", sex=" + sex + ", dog=" + dog.toString() + " " + dog.hashCode() + "]";
}
@Override
public Object clone() throws CloneNotSupportedException {
User2 user = null;
user = (User2)super.clone();
Dog d = user.getDog();
user.setDog((Dog)d.clone());
return user;
}
}
package com.prototype;
import java.io.Serializable;
public class Dog implements Serializable, Cloneable{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Dog(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
@Override
protected Object clone() throws CloneNotSupportedException {
Dog dog = null;
dog = (Dog)super.clone();
return dog;
}
}
深拷贝(序列化)(推荐使用)
package com.prototype;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* ���
* ϵ�л�
* @author zonkin
*
*/
public class User3 implements Serializable, Cloneable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private Integer age;
private String sex;
private Dog dog;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public User3(String name, Integer age, String sex, Dog dog) {
super();
this.name = name;
this.age = age;
this.sex = sex;
this.dog = dog;
}
@Override
public String toString() {
return "User3 [name=" + name + ", age=" + age + ", sex=" + sex + ", dog=" + dog.toString() + " " + dog.hashCode() + "]";
}
@Override
public Object clone(){
User3 user = null;
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(this);
bais = new ByteArrayInputStream(baos.toByteArray());
ois = new ObjectInputStream(bais);
user = (User3)ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(baos != null) {
baos.close();
}
if(oos != null) {
oos.close();
}
if(bais != null) {
bais.close();
}
if(ois != null) {
ois.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return user;
}
}