原型模式的作用是保存最原始的数据,例如一个订单类,需要保存最原始的数据,例如订单的数量和订单的种类(A产品100个,B产品1000个),那么订单到系统中需要分解成小订单,这就可以用原型模式。另一种场景用到原型模式,例如服务器群发邮件,只有地址不同,而其他部分相同。
public class Email implements Cloneable{
private String address;//要发送的地址
private String content;//邮件内容
//模拟邮件中的图片
private List<String> images = new ArrayList<String>();
@Override
protected Email clone(){
try{
Email email = (Email)super.clone();
email.setAddress(this.address);
email.setContent(this.content);
//浅拷贝会改变原文档的值
email.setImages(this.images);
//深拷贝不会改变原文档的值
// email.setImages((ArrayList<String>)this.images.clone());
return email;
}
return null;
}
public void setAddress(String address){
this.address = address;
}
public void setContent(String content){
this.content = content;
}
public String getAddress(){
return this.address;
}
public String getContent(){
return this.content;
}
public List<String> getImages(){
return this.images;
}
public void setImages(List<String> images){
this.images=images;
}
public void addImage(String img){
this.images.add(img);
}
public void showEmail(){
System.out.println("============================");
System.out.println("地址:"+address);
System.out.println("内容:"+content);
for(String img:images){
System.out.println("图片:"+img);
}
System.out.println("============================");
}
}
客户端的调用代码
public class Client{
public static void main(String[] args){
Email orginal = new Email();
orginal.setAddress("原始地址");
orginal.setContent("原始内容");
orginal.addImage("原始图片1");
orginal.addImage("原始图片2");
orginal.addImage("原始图片3");
orginal.showEmail();
Email email2 = orginal.clone();
email2.setAddress("改变地址2");
email2.showEmail();
orginal.showEmail();
//浅拷贝情况下只改变地址,原始的值不变,拷贝的地址改变
Email email3 = orginal.clone();
email3.setAddress("改变地址3");
email3.addImage("原始图片4");
email3.showEmail();
orginal.showEmail();
//浅拷贝清理下email3改变图片内容会影响原始的图片列表
//深拷贝情况下不影响
}
}
总结:使用原型模式需要保存原始的对象数据,使用深拷贝。