iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java如何实现原型模式
  • 745
分享到

java如何实现原型模式

java 2023-05-30 22:05:29 745人浏览 泡泡鱼
摘要

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

这篇文章主要介绍了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如何实现原型模式”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: java如何实现原型模式

本文链接: https://www.lsjlt.com/news/221678.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在 Golang 中替换正则表达式匹配的文本?
    在 go 中,可使用 regexp.replaceall 函数替换符合正则表达式的文本,该函数需要三个参数:待替换字符串、匹配模式和替换文本。例如,将字符串中 "fox" 替换为 "do...
    99+
    2024-05-14
    golang 正则表达式
  • 如何在 Golang 中测试随机数生成器的准确性?
    在 go 中测试随机数生成器准确性的步骤包括:生成大量随机数并计算每个范围内的出现次数,以确保均匀分布。针对指定均值和标准差计算每个范围内的出现次数,以确保正态分布。 如何在 Gola...
    99+
    2024-05-14
    golang 随机数
  • 面向对象设计原则在C++中的体现
    c++++ 体现了 oop 原则,包括:封装:使用类将数据和方法封装在对象中。继承:允许派生类从基类继承数据和行为。多态:允许对象的行为根据其类型而改变,通过虚函数实现。 面向对象设计...
    99+
    2024-05-14
    c++ 面向对象
  • c语言怎么区分小数和整数
    c 语言区分小数和整数的方法有:数据类型不同:小数类型(float、double)包含小数点,整数类型(int)不包含。printf() 函数中使用不同格式化字符串:小数用 %f,整数用...
    99+
    2024-05-14
    c语言
  • 设计模式在C++ 中的可复用性和可扩展性
    在 c++++ 中,设计模式通过提供经过验证的解决方案来提高可复用性和可扩展性。可复用性允许重复使用代码,例如 factory method 模式,它支持创建不同的产品而不影响具体类。可...
    99+
    2024-05-14
    c++ 设计模式 高可扩展性
  • C++语法中函数模板的灵活运用
    C++ 语法中函数模板的灵活运用 函数模板是 C++ 中的一项强大功能,允许您创建可用于不同数据类型的一组代码。这可以提高代码的可重用性,并使您能够编写更通用、更可维护的代码。 语法 ...
    99+
    2024-05-14
    c++语法 函数模板 c++
  • c语言怎么计算字符串长度和宽度
    在 c 语言中,计算字符串长度和宽度的函数分别为:strlen() 函数用于计算字符串长度,不包括终止符 '\0'。strwidth() 函数用于计算字符串在终端中的宽度,返回显示像素数...
    99+
    2024-05-14
    c语言
  • 如何用 Golang 正则匹配多个单词或字符串?
    golang 正则表达式使用管道符 | 来匹配多个单词或字符串,将各个选项作为逻辑 or 表达式分隔开来。例如:匹配 "fox" 或 "dog":fox|dog匹配 "quick"、"b...
    99+
    2024-05-14
    golang 正则 python
  • c语言怎么跳出多层循环
    在 c 语言中,可以使用嵌套的 break 语句跳出多层循环。对于每个要跳出的循环层,都需要一个单独的 break 语句。例如:使用一个 break 语句跳出内层循环再使用一个 brea...
    99+
    2024-05-14
    c语言
  • c语言怎么注释成中文
    c语言中文注释提供两种方式:行内注释(以"//"开头)和块注释(以"/"开头并以"/"结尾)。最佳实践包括:使用简明扼要的语言,在函数和类开头处添加块注释,在关键部分添加行内注释,保持注...
    99+
    2024-05-14
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作