原型模式:一句话总结,每次都会创建一个新的对象,这里Spring的scope=“prototype”,就是原型模式
其中原型模式分为两种:
一种是浅拷贝,浅拷贝的意思是说,copy对象的时候,只能copy一个类的基本属性类型以及String类型
一种是深拷贝,深拷贝的意思是说,copy对象的时候,除了一个类的基本属性类型以及String类型的成员变量之外,还包括它的引用类型,同样会进行copy
下面先说浅拷贝,浅拷贝也是最简单最容易理解的写法,实现cloneable接口,重写里面的clone方法,即可实现
话不多说,上代码:
public class sheep implements Cloneable{
private String name;
private Integer age;
private String color;
//省略 getter、setter、construct
//通过重写clone方法来实现浅拷贝
@Override
protected Object clone() throws CloneNotSupportedException{
Sheep sheep = (Sheep)super.clone();
return sheep;
}
}
public class client(){
main(){
Sheep sheep = new Sheep(“小白羊”,1,“白色”);
Sheep sheep2 = (Sheep)sheep.clone();
}
}
深拷贝:
深拷贝有两种实现形式:
一种是通过重写clone方法来实现
一种是通过序列化来实现
通过重写clone方法来实现:
@Override
protected Object clone() throws CloneNotSupportedException{
Sheep sheep = (Sheep)super.clone(); //实现基本属性的克隆
sheep.引用类型成员变量 = (引用类型)引用类型成员变量.clone();
return sheep;
}
通过序列化来实现:
// 可能会有异常,所以直接抛出当然也可以进行try catch 拦截
public Object deepClone() throws Exception{
// 创建流对象
ByteArrayOutputStream bos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bis = null;
ObjectInputStream ois = null;
//序列化
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(this); //当前这个对象以对象流的形式输出
//反序列化
bis = new ByteArrayInputStream(bos.toByteArray());
ois = new ObjectInputStream(bis);
Deep deep = (Deep)ois.readObject();
//关闭流
bos.close();
…
return deep;
}