原型模式要解决的问题
- MailUtil.saveOriginMailRecord(mail); 在存储原始文件的时候,未能存储原始文件,而是存储了经过循环代码修改的,最后一次循环修改过的文件;
- 解决这个问题的方案有2个:
- 在for循环前就存储原始文件;
- 在for循环体中new临时对象,这样会产生很多临时对象,如果Mail对象的构造很复杂,将消耗内存和性能,原型模式可以很好的解决这个问题;
public class Mail {
private String name;
private String emailAddress;
private String content;
public Mail() {
System.out.println("Mail Class Constructor");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "Mail{" +
"name='" + name + '\'' +
", emailAddress='" + emailAddress + '\'' +
", content='" + content + '\'' +
'}';
}
}
public class MailUtil {
public static void sendMain(Mail mail) {
String outputContent = "向 {0} 同学, 邮件地址: {1} , 邮件内容: {2} 发送邮件成功";
System.out.println(MessageFormat.format(outputContent,
mail.getName(),
mail.getEmailAddress(),
mail.getContent()));
}
public static void saveOriginMailRecord(Mail mail){
System.out.println("存储originMail记录,originMail:" + mail.getContent());
}
}
public class Test {
public static void main(String[] args) {
Mail mail = new Mail();
mail.setContent("初始化模板");
for (int i = 0; i < 10; i++) {
mail.setName("姓名" + i);
mail.setEmailAddress("姓名" + i + "@imooc.com");
mail.setContent("恭喜您,此次慕课网活动中奖了");
MailUtil.sendMain(mail);
}
MailUtil.saveOriginMailRecord(mail);
}
}
输出:
Mail Class Constructor
向 姓名0 同学, 邮件地址: 姓名0@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
向 姓名1 同学, 邮件地址: 姓名1@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
向 姓名2 同学, 邮件地址: 姓名2@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
向 姓名3 同学, 邮件地址: 姓名3@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
向 姓名4 同学, 邮件地址: 姓名4@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
向 姓名5 同学, 邮件地址: 姓名5@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
向 姓名6 同学, 邮件地址: 姓名6@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
向 姓名7 同学, 邮件地址: 姓名7@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
向 姓名8 同学, 邮件地址: 姓名8@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
向 姓名9 同学, 邮件地址: 姓名9@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
存储originMail记录,originMail:恭喜您,此次慕课网活动中奖了
使用原型模式解决问题
- 实现标记接口Cloneable;
- 重写 clone() 方法;
- clone() 方法不会调用构造器;
public class Mail implements Cloneable{
private String name;
private String emailAddress;
private String content;
public Mail() {
System.out.println("Mail Class Constructor");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "Mail{" +
"name='" + name + '\'' +
", emailAddress='" + emailAddress + '\'' +
", content='" + content + '\'' +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
System.out.println("Clone Mail Object");
return super.clone();
}
}
public class Test {
public static void main(String[] args) throws Exception{
Mail mail = new Mail();
mail.setContent("初始化模板");
for (int i = 0; i < 10; i++) {
Mail tempMail = (Mail)mail.clone();
tempMail.setName("姓名" + i);
tempMail.setEmailAddress("姓名" + i + "@imooc.com");
tempMail.setContent("恭喜您,此次慕课网活动中奖了");
MailUtil.sendMain(tempMail);
}
MailUtil.saveOriginMailRecord(mail);
}
}
输出:
Mail Class Constructor
Clone Mail Object
向 姓名0 同学, 邮件地址: 姓名0@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
Clone Mail Object
向 姓名1 同学, 邮件地址: 姓名1@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
Clone Mail Object
向 姓名2 同学, 邮件地址: 姓名2@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
Clone Mail Object
向 姓名3 同学, 邮件地址: 姓名3@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
Clone Mail Object
向 姓名4 同学, 邮件地址: 姓名4@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
Clone Mail Object
向 姓名5 同学, 邮件地址: 姓名5@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
Clone Mail Object
向 姓名6 同学, 邮件地址: 姓名6@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
Clone Mail Object
向 姓名7 同学, 邮件地址: 姓名7@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
Clone Mail Object
向 姓名8 同学, 邮件地址: 姓名8@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
Clone Mail Object
向 姓名9 同学, 邮件地址: 姓名9@imooc.com , 邮件内容: 恭喜您,此次慕课网活动中奖了 发送邮件成功
存储originMail记录,originMail:初始化模板