23种设计模式之原型模式(一)

原型模式

首先在这里感谢设计模式之禅这本书给我的启发,让我学到了很多东西。下面的部分内容就是借鉴此书。


举一个例子来更加清楚的解释原型模式:

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;
	}
	

}


下面我们来看一下Mail邮件类:

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;
	}
	
	

}


Mail类就是一个业务类的对象,虽然比较长,还是比较简单的呢,我们来看一下业务场景类是如何对邮件继续处理的:

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改成多线程的,具体看下一节。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值