Java设计模式之原型模式的示例详解

 更新时间:2022年02月16日 08:36:42   作者:温故知新之java  
原型模式(Prototype Pattern)指使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。本文将通过案例详细讲解一下原型模式,感兴趣的可以了解一下

定义

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 即实现了一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象的代价比较大时,则采用这种模式

案例

需求

张三要打印100000份照片

方案一

定义照片类

/**
 * 照片类
 * @author:liyajie
 * @createTime:2022/2/15 11:47
 * @version:1.0
 */
@Data
@AllArgsConstructor
public class Photo {
    private String name;
    private String type;
    private int size;
}

定义客户端类

/**
 * 客户端
 * @author:liyajie
 * @createTime:2022/2/15 11:49
 * @version:1.0
 */
public class Client {

    public void printPhoto(){
        Photo photo = new Photo("张三","彩色",2);
        for (int i = 0; i < 100000; i++) {
            Photo clone = new Photo(photo.getName(),photo.getType(),photo.getSize());
            System.out.println(clone);
        }
    }
}

定义测试类

/**
 * 测试类
 * @author:liyajie
 * @createTime:2022/2/15 11:51
 * @version:1.0
 */
public class Test {
    public static void main(String[] args) {
        Client client = new Client();
        client.printPhoto();
    }
}

测试结果

方案二

定义照片类

/**
 * 照片类
 * @author:liyajie
 * @createTime:2022/2/15 11:47
 * @version:1.0
 */
@Data
@AllArgsConstructor
public class PhotoNew implements Cloneable{
    private String name;
    private String type;
    private int size;

    @Override
    protected PhotoNew clone() {
        PhotoNew clone = null;
        try {
            clone = (PhotoNew)super.clone();
        }catch (Exception e){
            e.printStackTrace();
        }
        return clone;
    }
}

定义客户端类

/**
 * 客户端
 * @author:liyajie
 * @createTime:2022/2/15 11:49
 * @version:1.0
 */
public class ClientNew {

    public void printPhoto(){
        PhotoNew photoNew = new PhotoNew("张三","彩色",2);
        for (int i = 0; i < 100000; i++) {
            PhotoNew clone = photoNew.clone();
            System.out.println(clone);
        }
    }
}

定义测试类

/**
 * 测试类
 * @author:liyajie
 * @createTime:2022/2/15 11:51
 * @version:1.0
 */
public class TestNew {
    public static void main(String[] args) {
        ClientNew clientNew = new ClientNew();
        clientNew.printPhoto();
    }
}

测试结果

对比分析

  • 方案一:一般实现方法,使用for循环进行多次new实例化照片对象,该方案最多大的优势就是简单,容易理解;劣势就是多次使用new关键字,频繁的进行内存分配等,如果量大到一定的程度,性能会非常差
  • 方案二:原型模式实现方法,要实例化多次的类实现Cloneable,重写clone方法,使用for循环重复调用clone方法进行多次实例化,即是在内存中使用拷贝的方式进行创建对象,性能比new关键字会高很多

总结

通过以上两个方案的耗时比较,我们可以发现使用原型模式创建对象性能最优,所以在以下场景中我们可以选择使用原型模式:

1.当需要一个类的大量对象的时候

2.如果一个对象初始化太过繁琐

到此这篇关于Java设计模式之原型模式的示例详解的文章就介绍到这了,更多相关Java原型模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot+Hibernate实现自定义数据验证及异常处理

    SpringBoot+Hibernate实现自定义数据验证及异常处理

    这篇文章主要为大家介绍了SpringBoot如何整合Hibernate自定义数据验证及多种方式异常处理,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-04-04
  • Mybatis关联查询之一对多和多对一XML配置详解

    Mybatis关联查询之一对多和多对一XML配置详解

    这篇文章主要介绍了Mybatis关联查询之一对多和多对一XML配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Spring中的@Transactional注解使用详解

    Spring中的@Transactional注解使用详解

    这篇文章主要介绍了Spring中的@Transactional注解使用详解,@Transactional 是一个注解,用于在 Spring 框架中管理事务的声明式事务管理机制,它可以应用于方法或类级别,并指示方法或类在执行时应该被包装在一个事务中,需要的朋友可以参考下
    2024-01-01
  • Java设计模式中代理模式应用详解

    Java设计模式中代理模式应用详解

    代理模式(Proxy Parttern)为一个对象提供一个替身,来控制这个对象的访问,即通过代理对象来访问目标对象。本文将通过示例详细讲解一下这个模式,需要的可以参考一下
    2022-11-11
  • java 中模拟TCP传输的客户端和服务端实例详解

    java 中模拟TCP传输的客户端和服务端实例详解

    这篇文章主要介绍了java 中模拟TCP传输的客户端和服务端实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • SpringBoot Feign使用教程超全面讲解

    SpringBoot Feign使用教程超全面讲解

    现在的微服务项目不少都使用的是springboot+Feign构建的项目,微服务之间的调用都离不开feign来进行远程调用,这篇文章主要介绍了SpringBoot Feign使用教程,需要的朋友可以参考下
    2022-11-11
  • Servlet3.0新特性全解

    Servlet3.0新特性全解

    Servlet3.0新特性有异步处理支持、新增的注解支持、可插性支持,下面我们将逐一讲解这些新特性,通过下面的学习,读者将能够明晰了解Servlet 3.0的变化,并能够顺利使用它进行日常的开发工作
    2023-05-05
  • java 服务器接口快速开发之servlet详细教程

    java 服务器接口快速开发之servlet详细教程

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容
    2021-06-06
  • Java微信公众平台开发(11) 微信三大平台的关联

    Java微信公众平台开发(11) 微信三大平台的关联

    这篇文章主要介绍了Java微信公众平台开发第十一步,微信开发中微信公众平台、开放平台和商户平台的关联,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 使用Springboot自定义注解,支持SPEL表达式

    使用Springboot自定义注解,支持SPEL表达式

    这篇文章主要介绍了使用Springboot自定义注解,支持SPEL表达式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论