设计模式实战-原型模式

  0 导读 - 个性化电子账单

  ● 个性化服务

  一般银行都要求个性化服务,发过去的邮件上总有一些个人信息吧,比如“××先生”,“××女士”等

  ● 递送成功率

  邮件的递送成功率有一定的要求,由于大批量地发送邮件会被接收方邮件服务器误认是垃圾邮件,因此在邮件头要增加一些伪造数据,以规避被反垃圾邮件引擎误认为是垃圾邮件

  从这两方面考虑广告信的发送也是电子账单系统的一个子功能,来考虑一下广告信这个模块是怎么开发的

  既然是广告信,肯定需要一个模板,然后再从数据库中把客户的信息一个一个地取出,放到模板中生成一份完整的邮件,然后扔给发送机进行发送处理

  

发送电子账单类图

 

  广告信模板

  

 

  邮件类代码

  

 

  业务场景类

  

 

  

 

  仔细地想想,这个程序是否有问题?

  这是一个线程在运行,也就是你发送的是单线程的,那按照一封邮件发出去需要0.02秒(够小了,你还要到数据库中取数据呢),600万封邮件需要33个小时,也就是一个整天都发送不完,今天的没发送完,明天的账单又产生了,日积月累,激起甲方人员一堆抱怨,那怎么办?

  好办,把sendMail修改为多线程,但是只把sendMail修改为多线程还是有问题的呀

  产生第一封邮件对象,放到线程1中运行,还没有发送出去

  线程2也启动了,直接就把邮件对象mail的收件人地址和称谓修改掉了,线程不安全了

  说到这里,你会说这有N多种解决办法,其中一种是使用一种新型模式来解决这个问题:通过对象的复制功能来解决这个问题,类图稍做修改

  

修改后的发送电子账单类图

 

  增加了一个Cloneable接口, Mail实现了这个接口,在Mail类中覆写clone()方法,我们来看Mail类的改变

  

 

  实现了一个接口,并重写了clone方法

  再来看场景Client的变化

  1 定义与类型

  

 

  

 

  2 适用场景

  

 

  3 优点

  

 

  4 缺点

  

 

  5 扩展

  

 

  6 coding实战

  6.1 接口(最常用)

  

 

  

 

  

 

  调用 clone 方法时,并不会调用构造器

  

 

  6.2 抽象类

  


 

  

 

  6.3 深浅克隆

  

 

  非同一对象

  

 

  6.4 克隆破坏单例

  改造后的单例类

  

 

  改造后的测试类

  

 

  输出结果

  

 

  可看出,并非同一结果,破坏了单例模式!!!

  那么如何修改呢???

  

 

  

 

  所以将其 clone 方法重写,直接获取实例即可.

  或者不实现 cloneable 接口,就不会出现克隆破坏单例模式的现象.7 实际应用

  

 

  

 

  

 

  

 

  

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值