原型模式

 原型模式

定义:通过复制现有实例来创建新的实例,无需知道相应类的信息。

简单地理解,其实就是当需要创建一个指定的对象时,我们刚好有一个这样的对象,但是又不能直接使用,我会clone一个一毛一样的新对象来使用;基本上这就是原型模式。关键字:Clone

1.1 深拷贝和浅拷贝

浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。clone明显是深复制,clone出来的对象是是不能去影响原型对象的

1.2 原型模式的结构和代码示例

Client:使用者

Prototype:接口(抽象类),声明具备clone能力,例如java中得Cloneable接口

ConcretePrototype:具体的原型类

可以看出设计模式还是比较简单的,重点在于Prototype接口和Prototype接口的实现类ConcretePrototype。原型模式的具体实现:一个原型类,只需要实现Cloneable接口,覆写clone方法,此处clone方法可以改成任意的名称,因为Cloneable接口是个空接口,你可以任意定义实现类的方法名,如cloneA或者cloneB,因为此处的重点是super.clone()这句话,super.clone()调用的是Object的clone()方法。

 
  1. public class Prototype implements Cloneable {

  2. public Object clone() throws CloneNotSupportedException {

  3. Prototype proto = (Prototype) super.clone();

  4. return proto;

  5. }

  6. }

举例(银行发送大量邮件,使用clone和不使用clone的时间对比):我们模拟创建一个对象需要耗费比较长的时间,因此,在构造函数中我们让当前线程sleep一会

 
  1. public Mail(EventTemplate et) {

  2. this.tail = et.geteventContent();

  3. this.subject = et.geteventSubject();

  4. try {

  5. Thread.sleep(1000);

  6. } catch (InterruptedException e) {

  7. // TODO Auto-generated catch block

  8. e.printStackTrace();

  9. }

  10. }

不使用clone,发送十个邮件

 
  1. public static void main(String[] args) {

  2. int i = 0;

  3. int MAX_COUNT = 10;

  4. EventTemplate et = new EventTemplate("9月份信用卡账单", "国庆抽奖活动...");

  5. long start = System.currentTimeMillis();

  6. while (i < MAX_COUNT) {

  7. // 以下是每封邮件不同的地方

  8. Mail mail = new Mail(et);

  9. mail.setContent(getRandString(5) + ",先生(女士):你的信用卡账单..." + mail.getTail());

  10. mail.setReceiver(getRandString(5) + "@" + getRandString(8) + ".com");

  11. // 然后发送邮件

  12. sendMail(mail);

  13. i++;

  14. }

  15. long end = System.currentTimeMillis();

  16. System.out.println("用时:" + (end - start));

  17. }

 

用时:10001

使用clone,发送十个邮件

 
  1. public static void main(String[] args) {

  2. int i = 0;

  3. int MAX_COUNT = 10;

  4. EventTemplate et = new EventTemplate("9月份信用卡账单", "国庆抽奖活动...");

  5. long start=System.currentTimeMillis();

  6. Mail mail = new Mail(et);

  7. while (i < MAX_COUNT) {

  8. Mail cloneMail = mail.clone();

  9. mail.setContent(getRandString(5) + ",先生(女士):你的信用卡账单..."

  10. + mail.getTail());

  11. mail.setReceiver(getRandString(5) + "@" + getRandString(8) + ".com");

  12. sendMail(cloneMail);

  13. i++;

  14. }

  15. long end=System.currentTimeMillis();

  16. System.out.println("用时:"+(end-start));

  17. }

用时:1001

1.3 总结

原型模式的本质就是clone,可以解决构建复杂对象的资源消耗问题,能再某些场景中提升构建对象的效率;还有一个重要的用途就是保护性拷贝,可以通过返回一个拷贝对象的形式,实现只读的限制。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值