23种设计模式之原型模式(一)
2015-06-17 23:26
288 查看
原型模式
首先在这里感谢设计模式之禅这本书给我的启发,让我学到了很多东西。下面的部分内容就是借鉴此书。
举一个例子来更加清楚的解释原型模式:
AdvTemplate类是一个广告信的模板,一般都是从数据库中取出,这里我们使用一个静态的值来做代表,Mail类是一封邮件类,发送机发送的就是这个类,我们先来看看下AdvTemplate类:
下面我们来看一下Mail邮件类:
Mail类就是一个业务类的对象,虽然比较长,还是比较简单的呢,我们来看一下业务场景类是如何对邮件继续处理的:
运行的结果如下:
大家看一下这个程序是不是有问题。Look here 这个是一个线程在运行,也就是发送的单线程的,那按照一封邮件发出去需要0.02s,600万的花就需要33小时,也就是一个整天都发送不完,今天发送不完明天账单又产生了,日积月累肯定是不行的。
这个好办,我们把sendMail改成多线程的,具体看下一节。
首先在这里感谢设计模式之禅这本书给我的启发,让我学到了很多东西。下面的部分内容就是借鉴此书。
举一个例子来更加清楚的解释原型模式:
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改成多线程的,具体看下一节。
相关文章推荐
- Android基础教程之简单的Button事件响应综合提示控件Toast的应用
- OpenCv下载地址
- UVA 11827 Maximum GCD
- 如何将svn项目迁移到git管理上去
- 游戏开发,何去何从
- “来用”Beta版使用说明
- 国内app快速生成平台对比
- perl6之'Hello World'
- 纯 CSS 实现高度与宽度成比例的效果
- [leetcode] Divide Two Integers
- JavaMail实现收发邮件——(二)发送邮件
- 浅析Apache Storm 0.10.0-beta发布:剑指Heron
- 浅析Apache Storm 0.10.0-beta发布:剑指Heron
- 程序员_区别01
- Java JDBC批处理插入数据操作
- LightOJ 1214(大数相除)
- C++面试宝典(整理版)3
- virtualization--Virt tools
- python模块MySQLdb
- Java基础知识学习。(2015,6,17)