23种设计模式(3) java原型模式

 更新时间:2020年06月28日 15:20:17   作者:阿木侠  
这篇文章主要为大家详细介绍了23种设计模式之java原型模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

23种设计模式第三篇: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知音

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring通过配置文件管理Bean对象的方法

    Spring通过配置文件管理Bean对象的方法

    这篇文章主要介绍了Spring通过配置文件管理Bean对象的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • SpringBoot登录、退出、获取用户信息的session处理方案

    SpringBoot登录、退出、获取用户信息的session处理方案

    这篇文章主要介绍了SpringBoot登录、退出、获取用户信息的session处理,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • java Spring整合Freemarker的详细步骤

    java Spring整合Freemarker的详细步骤

    本文对Spring整合Freemarker步骤做了详细的说明,按步骤操作一定可以整合通过,这里提供给大家做参考
    2013-11-11
  • Java使用CountDownLatch实现网络同步请求的示例代码

    Java使用CountDownLatch实现网络同步请求的示例代码

    CountDownLatch 是一个同步工具类,用来协调多个线程之间的同步,它能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。被将利用CountDownLatch实现网络同步请求,异步同时获取商品信息组装,感兴趣的可以了解一下
    2023-01-01
  • 关于Java中反射的作用义及使用方法

    关于Java中反射的作用义及使用方法

    这篇文章主要介绍了关于Java中反射的作用义及使用方法,反射使得程序可以在运行时对类进行检查和操作,而不需要在编译时知道类的完整信息,需要的朋友可以参考下
    2023-07-07
  • 通过Java实现添加或删除PDF中的附件

    通过Java实现添加或删除PDF中的附件

    当我们在制作PDF文件或者PPT演示文稿的时候,为了让自己的文件更全面详细,就会在文件中添加附件。本文为大家整理了Java实现添加或删除PDF中的附件的方法,需要的可以参考下
    2023-01-01
  • java线程池使用场景及一些建议

    java线程池使用场景及一些建议

    本文主要介绍了java线程池使用场景及一些建议,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 基于MapReduce实现决策树算法

    基于MapReduce实现决策树算法

    这篇文章主要为大家详细介绍了基于MapReduce实现决策树算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • sqlserver的jdbc配置方法

    sqlserver的jdbc配置方法

    这篇文章主要介绍了sqlserver的jdbc配置方法,需要的朋友可以参考下
    2014-04-04
  • Java实现XML文件学生通讯录

    Java实现XML文件学生通讯录

    这篇文章主要为大家详细介绍了Java实现XML文件学生通讯录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论