原型模式
首先在这里感谢设计模式之禅这本书给我的启发,让我学到了很多东西。下面的部分内容就是借鉴此书。
举一个例子来更加清楚的解释原型模式:
AdvTemplate类是一个广告信的模板,一般都是从数据库中取出,这里我们使用一个静态的值来做代表,Mail类是一封邮件类,发送机发送的就是这个类,我们先来看看下AdvTemplate类:
public class AdvTemplate {
//广告信名称
private String advSubject = "xx银行端午信用卡抽奖活动";
//广告信内容
private String advContext = "端午抽奖活动通知,只要刷卡就送一百万...";
//取得广告信名称
public String getAdvSubject(){
return this.advSubject;
}
//取得广告信内容
public String getAdvContext(){
return this.advContext;
}
}
public class Mail {
//收件人
private String receiver;
//邮件名称
private String subject;
//称谓
private String appellation;
//邮件内容
private String context;
//邮件的尾部,一般加上xxx版权所有
private String tail;
//构造函数
public Mail(AdvTemplate advTemplate){
this.context = advTemplate.getAdvContext();
this.subject = advTemplate.getAdvSubject();
}
//set get方法
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 String getTail() {
return tail;
}
public void setTail(String tail) {
this.tail = tail;
}
}
import java.util.Random;
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("xxx银行版权所有");
while(i<MAX_COUNT){
mail.setAppellation(getRandString(5) +"先生(女士)");
mail.setReceiver(getRandString(5) + "@" + getRandString(8) + ".com");
sendMail(mail);
i++;
}
}
//发送邮件
public static void sendMail(Mail mail){
System.out.println("标题:" + mail.getSubject() + "\t收件人:" + mail.getReceiver() + "\t发送成功!");
}
//指定长度随机字符串
public static String getRandString(int maxLength){
String source = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
StringBuffer buffer = new StringBuffer();
Random random = new Random();
for(int i = 0; i<maxLength; i++){
buffer.append(source.charAt(random.nextInt(source.length())));
}
return buffer.toString();
}
}
运行的结果如下:
标题:xx银行端午信用卡抽奖活动 收件人:tGwOW@yqilcYMM.com 发送成功!
标题:xx银行端午信用卡抽奖活动 收件人:XrCKF@IBzIuuWn.com 发送成功!
标题:xx银行端午信用卡抽奖活动 收件人:hzkWX@yjlJSTJD.com 发送成功!
标题:xx银行端午信用卡抽奖活动 收件人:AYVVR@rWlSisTk.com 发送成功!
标题:xx银行端午信用卡抽奖活动 收件人:tpReC@QeyQkROL.com 发送成功!
标题:xx银行端午信用卡抽奖活动 收件人:ieamo@LUnesEsP.com 发送成功!
大家看一下这个程序是不是有问题。Look here 这个是一个线程在运行,也就是发送的单线程的,那按照一封邮件发出去需要0.02s,600万的花就需要33小时,也就是一个整天都发送不完,今天发送不完明天账单又产生了,日积月累肯定是不行的。
这个好办,我们把sendMail改成多线程的,具体看下一节。