原型模式和模板模式两者在我理解都是取出重复的代码,减少重复代码的编写。不同的是实现的方式不一样,原型模式,使用的clone的方法,将类中的部分方法进行clone以达到创建相似的属性,减少重复。
原型模型的应用场景:
通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式,
一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone的方法创建一个对象,然后由工厂方法提供给调用者。原型模式先产生出一个包含大量共有信息的类,然后可以拷贝出副本,修正细节信息,建立了一个完整的个性对象。
clone经常需要注意的是浅度克隆和深度克隆,下面以例子说明两者的区别。
首先是浅克隆
//如果要克隆就必须实现Cloneable接口
public class Person implements Cloneable{
private String name;
private String sex;
private List<String> list;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
//可能会抛出不支持克隆异常,原因是没有实现Cloneable接口
@Override
protected Person clone(){
try{
return (Person) super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
return null;
}
}
}
这里引用对象list在克隆创建时还是引用的原来的对象。
注意:即引用时是值引用的数据类型,比如int,short,long,byte,float,double,char,boolean,其它都是对象引用
public class Person implements Cloneable{
private String name;
private String sex;
private List list;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
//可能会抛出不支持克隆异常,原因是没有实现Cloneable接口
@Override
protected Person clone(){
try{
Person person = (Person) super.clone();
List newList = new ArrayList();
for(String str : this.list){
newList.add(str);
}
person.setList(newList);
return person;
}catch(CloneNotSupportedException e){
e.printStackTrace();
return null;
}
}
}
这样完成了深度克隆。
模板模式将共同的属性提取到超类或者父类中,不同的子类继承共同的属性,主要用到java中的继承,例子很多。