我们日常工作中,部门领导需要了解项目进度,存在的问题,就会开个部门例会,此时需要邮件群发到部门各个员工:
邮件模板类:
public class MailTemplate
{
//邮件主题
private String mailSubject = "请软件部来301室开会";
//邮件内容
private String mailContext = "梳理一下项目上存在的问题";
public String getMailSubject()
{
return mailSubject;
}
public void setMailSubject(String mailSubject)
{
this.mailSubject = mailSubject;
}
public String getMailContext()
{
return mailContext;
}
public void setMailContext(String mailContext)
{
this.mailContext = mailContext;
}
}
邮件类:
public class Mail
{
//收件人
private String receiver;
//邮件名称
private String subject;
//称谓
private String appellation;
//邮件内容
private String context;
public Mail( MailTemplate mailTemplate)
{
this.context = mailTemplate.getMailContext();
this.subject = mailTemplate.getMailSubject();
}
public String getReceiver()
{
return receiver;
}
public void setReceiver(String receiver)
{
this.receiver = receiver;
}
public String getSubject()
{
return subject;
}
public void setSubject(String subject)
{
this.subject = subject;
}
public String getAppellation()
{
return appellation;
}
public void setAppellation(String appellation)
{
this.appellation = appellation;
}
public String getContext()
{
return context;
}
public void setContext(String context)
{
this.context = context;
}
}
部门老大:
public class Client
{
public static void main(String[] args)
{
int i=0;
Mail mail = new Mail(new MailTemplate());
while(i<6)
{
mail.setAppellation((getRandString(2)+"工程师"));
mail.setReceiver(getRandString(5)+"@"+getRandString(8)+".com");
sendMail(mail);
i++;
}
}
private static void sendMail(Mail mail)
{
// TODO Auto-generated method stub
System.out.println("标题:"+"请"+mail.getAppellation()+mail.getSubject() + "\t收件人:"+mail.getReceiver()+"\t内容:"+mail.getContext()+"\t...发送成功");
}
private static String getRandString(int max)
{
String source = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuffer buffer = new StringBuffer();
Random random = new Random();
for(int i =0;i<max;i++)
{
buffer.append(source.charAt(random.nextInt(source.length())));
}
return buffer.toString();
}
}
发送结果:
标题:请Fo工程师来301室开会 收件人:eJUTM@ffmFmySs.com 内容:梳理一下项目上存在的问题 ...发送成功
标题:请pp工程师来301室开会 收件人:yGHDa@tWZeJGDK.com 内容:梳理一下项目上存在的问题 ...发送成功
标题:请Eu工程师来301室开会 收件人:rgrmn@ppPXgHeF.com 内容:梳理一下项目上存在的问题 ...发送成功
标题:请BC工程师来301室开会 收件人:SJSOK@JmOnrsCz.com 内容:梳理一下项目上存在的问题 ...发送成功
标题:请jk工程师来301室开会 收件人:XPvpv@yXsYNWbh.com 内容:梳理一下项目上存在的问题 ...发送成功
标题:请GF工程师来301室开会 收件人:LQhgX@ZogoOKEl.com 内容:梳理一下项目上存在的问题 ...发送成功
整个开会的邮件全部发出,现在设想一下,如果一封邮件要发出去需要0.1s,那么有600万用户需要发送那么可以想一下这些邮件一天都发不完,如果我们采用多线程发送又存在线程不安全问题,我们这里使用原型模式通过对象复制来完成这个需求。
我们让Mail类实现Cloneable接口:
public class Mail implements Cloneable
{
//收件人
private String receiver;
//邮件名称
private String subject;
//称谓
private String appellation;
//邮件内容
private String context;
public Mail( MailTemplate mailTemplate)
{
this.context = mailTemplate.getMailContext();
this.subject = mailTemplate.getMailSubject();
}
public String getReceiver()
{
return receiver;
}
public void setReceiver(String receiver)
{
this.receiver = receiver;
}
public String getSubject()
{
return subject;
}
public void setSubject(String subject)
{
this.subject = subject;
}
public String getAppellation()
{
return appellation;
}
public void setAppellation(String appellation)
{
this.appellation = appellation;
}
public String getContext()
{
return context;
}
public void setContext(String context)
{
this.context = context;
}
@Override
protected Object clone()
{
Mail mail = null;
try {
mail = (Mail) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mail;
}
}
部门领导:
public class Client
{
public static void main(String[] args)
{
int i=0;
Mail mail = new Mail(new MailTemplate());
while(i<6)
{
Mail cloneMail = (Mail) mail.clone();
cloneMail.setAppellation((getRandString(2)+"工程师"));
cloneMail.setReceiver(getRandString(5)+"@"+getRandString(8)+".com");
sendMail(cloneMail);
i++;
}
}
private static void sendMail(Mail mail)
{
// TODO Auto-generated method stub
System.out.println("标题:"+"请"+mail.getAppellation()+mail.getSubject() + "\t收件人:"+mail.getReceiver()+"\t内容:"+mail.getContext()+"\t...发送成功");
}
private static String getRandString(int max)
{
String source = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuffer buffer = new StringBuffer();
Random random = new Random();
for(int i =0;i<max;i++)
{
buffer.append(source.charAt(random.nextInt(source.length())));
}
return buffer.toString();
}
}
执行结果:
标题:请Gg工程师来301室开会 收件人:XdNmL@MbqzXPHh.com 内容:梳理一下项目上存在的问题 ...发送成功
标题:请cV工程师来301室开会 收件人:vIZHG@NuHeFjqK.com 内容:梳理一下项目上存在的问题 ...发送成功
标题:请tA工程师来301室开会 收件人:wZbum@izTjuoAy.com 内容:梳理一下项目上存在的问题 ...发送成功
标题:请Wb工程师来301室开会 收件人:kbuoI@hnObuRnQ.com 内容:梳理一下项目上存在的问题 ...发送成功
标题:请kC工程师来301室开会 收件人:RZuYZ@DuOfRoVL.com 内容:梳理一下项目上存在的问题 ...发送成功
标题:请WT工程师来301室开会 收件人:FwlxK@xSMMQred.com 内容:梳理一下项目上存在的问题 ...发送成功
一样完成了邮件的发送,而且与多线程没有关系,我们通过对象的复制来完成快速发送邮件的方式叫做原型模式。
原型模式定义
原型模式:Specify the kind of objects to create using a prototypical instance,and create new objects by copying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)
原型模式的核心就是一个clone方法,通过该方法进行对象的拷贝。
原型模式的优点:
性能优良:存在二进制流的拷贝,比new一个对象性能好很多。
逃避构造函数的约束:这个既是优点也是缺点,直接在内存中拷贝,不会执行构造方法。
原型模式使用时注意的事项:
1.构造函数不会被执行,我们调用clone方法复制对象时,我们的构造方法不会执行。
2.深复制和浅复制
浅复制:Object提供的clone方法知识拷贝本对象,其对象内的数组、引用对象等都不拷贝,但是原生数据类型和String类型都会拷贝,还是指向原生对象的内部元素地址。
深复制:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
要实现深复制只要在clone方法中添加引用对象的拷贝就可以。