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

来源:互联网 发布:电脑点歌软件下载 编辑:程序博客网 时间:2024/05/22 14:40

原型模式

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


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

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


0 0