- 定义:不通过new产生新对象而是通过clone来实现的模式即为原型模式。
- 优点:clone方法直接拷贝内存二进制流,比new对象性能好很多。
- 缺点:直接在内存中拷贝,则构造函数不会执行。
- 浅拷贝:clone后的新对象与原对象使用的成员变化(数组类型、引用类型,但不包括String)为同一个对象,并未copy一个新变量给新对象。
- clone()浅拷贝:Object类提供clone方法只是拷贝本对象(本对象的int、long、String等成员),其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址.
- clone()深拷贝:thing.arrayList = (ArrayList)this.arrayList.clone();
- 不可对final成员执行clone方法
- 代码:
public class AdvTemplate {
private String advSubject ="XX银行国庆信用卡抽奖活动";//广告信名称
private String advContext = "国庆抽奖通知:只要刷卡就送1百万!";//广告信内容
public String getAdvSubject() {
return advSubject;
}
public String getAdvContext() {
return advContext;
}
}
public class Mail implements Cloneable{
private String receiver;//收件人 get set
private String subject;//邮件主题 get set
private String appellation;//称谓 get set
private String contxt;//邮件内容 get set
private String tail;//邮件的尾部,一般都是加上“XXX版权所有”等信息 get set
public Mail(AdvTemplate advTemplate) {
this.subject = advTemplate.getAdvSubject();
this.contxt = advTemplate.getAdvContext();
}
public Mail clone(){
Mail mail = null;
try{
mail = (Mail)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return mail;
}
}
public class Client {
private static int MAX_COUNT = 6;//发送账单的数量,这个值是从数据库中获得
public static void main(String[] args){//模拟发送邮件
int i=0;
//把模板定义出来,这个是从数据库中获得
Mail mail = new Mail(new AdvTemplate());
mail.setTail("XX银行版权所有");
while(i<MAX_COUNT){
//以下是每封邮件不同的地方
Mail cloneMail = mail.clone();
cloneMail.setAppellation(getRandString(5)+" 先生(女士)");
cloneMail.setReceiver(getRandString(5) + "@" + getRandString(8)+".com");
//然后发送邮件
sendMail(cloneMail);
i++;
}
}
//发送邮件
public static void sendMail(Mail mail){
System.out.println("标题:"+mail.getSubject() + "\t收件人:"+mail.getReceiver()+"\t....发送成功!");
}
//获得指定长度的随机字符串
public static String getRandString(int maxLength){
String source ="abcdefghijklmnopqrskuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuffer sb = new StringBuffer();
Random rand = new Random();
for(int i=0;i<maxLength;i++){
sb.append(source.charAt(rand.nextInt(source.length())));
}
return sb.toString();
}
}