文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java如何实现原型模式

2023-05-30 22:31

关注

这篇文章主要介绍了java如何实现原型模式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

定义:

        通过复制现有的对象实例来创建新的对象实例。

实现:

实现Cloneable接口:

        Cloneable接口的作用是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。

重写Object类中的clone方法:

        Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,原型类需要将clone方法的作用域修改为public类型。

示例:

例如,对于拿邮件发邀请函,邮件类大部分内容都是一样的:邀请原由、相邀地点,相聚时间等等,但对于被邀请者的名称和发送的邮件地址是不同的。

定义Mail类:

public class Mail implements Cloneable {    private String receiver;    private String subject;    private String content;    private String tail;    public Mail(EventTemplate et) {        this.tail = et.geteventContent();        this.subject = et.geteventSubject();  }    @Override  public Mail clone() {    Mail mail = null;      try {      mail = (Mail) super.clone();          } catch (CloneNotSupportedException e) {          // TODO Auto-generated catch block      e.printStackTrace();    }    return mail;  }//get、set.....}

测试方法:

public static void main(String[] args) {  int i = 0;  int MAX_COUNT = 10;  EventTemplate et = new EventTemplate("邀请函(不变)", "婚嫁生日啥的....(不变部分)");  Mail mail = new Mail(et);    while (i < MAX_COUNT) {    Mail cloneMail = mail.clone();    cloneMail.setContent("XXX先生(女士)(变化部分)"   + mail.getTail());    cloneMail.setReceiver("每个人的邮箱地址...com(变化部分)");    sendMail(cloneMail);    i++;  }}

优点:

        1、使用原型模型创建一个对象比直接new一个对象更有效率,因为它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
        2、隐藏了制造新实例的复杂性,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。

缺点:

        1、由于使用原型模式复制对象时不会调用类的构造方法,所以原型模式无法和单例模式组合使用,因为原型类需要将clone方法的作用域修改为public类型,那么单例模式的条件就无法满足了。
        2、使用原型模式时不能有final对象。
        3、Object类的clone方法只会拷贝对象中的基本数据类型,对于数组,引用对象等只能另行拷贝。这里涉及到深拷贝和浅拷贝的概念。

深拷贝与浅拷贝:

浅拷贝:

        将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的(这样不安全)。

深拷贝:

        将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。

那么深拷贝如何具体实现呢?

继续上面的例子,增加了一个ArrayList属性。

private String receiver;private String subject;private String content;private String tail;private ArrayList<String> ars;

此时,单mail = (Mail) super.clone();无法将ars指向的地址区域改变,必须另行拷贝:

try {    mail = (Mail) super.clone();        mail.ars = (ArrayList<String>)this.ars.clone();   } catch (CloneNotSupportedException e) {     e.printStackTrace();}

适用场景:

        1、复制对象的结构和数据。
        2、希望对目标对象的修改不影响既有的原型对象。
        3、创建一个对象的成本比较大。

感谢你能够认真阅读完这篇文章,希望小编分享的“java如何实现原型模式”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯