设计23式—原型

来源:互联网 发布:淘宝详情图尺寸是多少 编辑:程序博客网 时间:2024/06/07 15:16
/* * 原型模式 */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();}@Overrideprotected 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;}@Overridepublic void run() {System.out.println("收件人:"+mail.getReceiver()+",名称:"+mail.getSubject()+",内容:"+mail.getContext()+",时间:"+new Date().getTime());}}//扩展//clone不会拷贝数组、引用对象数据地址上的数据,只是拷贝的引用,可通过手动调用对象的clone()实现数据地址上的数据拷贝。