原型模式
原型模式:用原型实例指定对象的种类,并且通过拷贝这些原型,创建新的对象
原型模式是一种创建型设计模式,允许一个对象再创建另一个可以定制的对象,无需知道如何创建的细节
-
工作原理:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的都西昂通过请求原型对象拷贝他们自己来实施创建,即对象.clone()
class Sheep implements Cloneable{ Sheep friend; //继承自Object,使用默认克隆方法完成 //默认会使用浅拷贝,克隆后的对象也会指向同一个朋友 @Ovrride clone() throws CloneNotSupportException{ Sheep sheep =null; try{ sheep=(Sheep)super.clone(); }catch(e){} return sheep; } } class main(){ psvm(){ Sheep sheep = new Sheep("白",12,"tom"); sheep.friend=new Sheep("粉",11,"lisa"); Sheep sheep2 = sheep.clone(); sheep.friend==sheep2.friend;//true } }
浅拷贝
- 对于数据类型是基本数据类型 的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象
- 对于数据类型是引用数据类型的成员变量,比如说某个数组,类的对象等,浅拷贝会进行引用传递,也就是将该成员变量的引用值(==内存地址==)复制一份给新的对象.因为实际上两个对象的成员变量指向同一个对象实例,再.修改成员变量将同时影响两个对象.
深拷贝
- 复制对象的所有基本数据类型的成员变量值
- 为所有引用数据类的成员变量申请新的存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象.也就是说,对象进行深拷贝要对整个对象进行拷贝
- 实现方法:
- 重写clone方法
- 通过对象序列化实现
深拷贝
class DeepSheep implements Serializable,Cloneable{
String name;
DeepSheep ftiend;//引用类型
DeepSheep(){super();}
@Ovrride
Object clone(){
Object deep=null;
deep=super.clone();
//对引用类型的属性进行手动单独处理
DeepSheep deepprot = (DeepSheep)deep;
deeppro.ftiend = (DeepSheep)ftiend.clone();
return deep;
}
//使用序列化
Object serial(){
ByteArrayOutputStream bos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bis = null;
ObjectInputStream ois = null;
try{
bos=new ByteArrayOutputStream();
oos=new ObjectOutputStream();
oos.writeObject(this);//当前这个对象以对象流的方式输出
//反序列化
bis=new ByteArrayInputStream();
ois=new ObjectInputStream(bis);
DeepSheep friend=(DeepSheep)ois.readObject();
return friend;
}catch(e){return null;}
finally{
bos.close();
oos.close();
bis.close();
ois.close();
}
}
}
class main(){
psvm(){
DeepSheep sheep=new DeepSheep("黑",12,"kitty");
sheep.friend=nwe DeepSheep("白",12,"puppy");
DeepSheep sheep2=(DeepSheep)sheep.clone();
}
}
序列化