原型模式
原型模式就是通过clone()方法,进行拷贝原型对象。需要注意的是我们通过clone()方法获得的对象是可以定制的。
举个例子:
假如我们有个Person类
public class Person{
String name;
int age;
public Person(String name,int age){
this.name=name;
this.age=age;
};
....
}
Person a=new Person("wang",18);
Person b=a;
Person c=a;
表面上看a,b,c应该是三个值相同的Person对象,但需要注意的是a,b,c指向的是同一个对象,也就是说当我们修改其中一个时,其他的也会跟着变化!
Person a=new Person("wang",18);
Person b=a.clone();
Person c=a.clone();
此时a,b,c指向不同的对象,可以实现定制化修改!
clone()方法
实现clone()方法需要继承Cloneable接口。
它的实现也比较简单.我们还以Person为例
@Override
public Person clone(){
try{
return (Person)super.clone();
}catch (CloneNotSupportedException e){
throw new AssertionError();//不写也行,因为只要继承Cloneable接口就不会产生异常
}
}
可以注意到我们直接调用super.clone()方法!
但需要注意的是:
super.clone()方法对于引用类型来说,克隆出的对象与原对象指向的是同一个对象!
假如Person类有个属性为 Child类对象。此时我们就不能简单的调用super.clone()方法,而是对引用对象的域进行单独处理
@Override
public Person clone(){
Person p=null;
try{
p=(Person)super.clone();
p.child=child.clone();
return p;
}catch (CloneNotSupportedException e){
throw new AssertionError();//不写也行,因为只要继承Cloneable接口就不会产生异常
}
}