/*
* 原型模式
*/
public class MyMain {
public static void main(String[] args) {
Mail mail=new Mail(new AdvTemplate());
System.out.println("开始时间:"+new Date().getTime());
for(int i=0;i<1000;i++)
{
//不使用clone(),多线程调用同一个实例出现错误
/*mail.setReceiver(i+"号");
new Thread(new sendMail(mail)).start();*/
//原型模式,调用clone()方法,使得Mail能够适用与多线程
Mail cloneMail=mail.clone();
cloneMail.setReceiver(i+"号");
new Thread(new sendMail(cloneMail)).start();
}
}
}
class Mail implements Cloneable {
// 收件人
private String receiver;
// 邮件名称
private String subject;
// 邮件内容
private String context;
public Mail(AdvTemplate advTemplate) {
this.context=advTemplate.getAdvContext();
this.subject=advTemplate.getAdvSubject();
}
@Override
protected Mail clone() {
Mail mail=null;
try {
mail=(Mail)super.clone();
} catch (Exception e) {
e.printStackTrace();
}
return mail;
}
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 getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
}
class AdvTemplate {
// 广告信名称
private String advSubject = "A";
// 广告信内容
private String advContext = "B";
// 取得广告信的名称
public String getAdvSubject() {
return this.advSubject;
}
// 取得广告信的内容
public String getAdvContext() {
return this.advContext;
}
}
//发送信息的线程
class sendMail implements Runnable{
Mail mail=null;
public sendMail(Mail mail) {
this.mail=mail;
}
@Override
public void run() {
System.out.println("收件人:"+mail.getReceiver()+",名称:"+mail.getSubject()+",内容:"+mail.getContext()+",时间:"+new Date().getTime());
}
}
//扩展
//clone不会拷贝数组、引用对象数据地址上的数据,只是拷贝的引用,可通过手动调用对象的clone()实现数据地址上的数据拷贝。
设计23式—原型
最新推荐文章于 2024-09-12 10:00:00 发布