原型模式属于创建型设计模式,可以重复的创建对象,并且保证效率。什么意思呢?也就是说,当我们大批量创建对象时,使用原型模式,会更高效。这里隐含1层含义:

1,当数据量达到一定规模是,原型模式创建对象的效率高于new对象。

真的吗,我们来试试。

首先创建2个bean,一个是普通的javabean,一个是实现了Cloneable接口的javabean

package com.yangcq.learning.hantang.learning;import lombok.Data;@Data
public class NormalNewObjectBean {public NormalNewObjectBean() {System.out.println("NormalNewObjectBean init");}/*** 商品编码*/private String skuCode;/*** 商品名称*/private String skuName;/*** 库存*/private int quantity;}
package com.yangcq.learning.hantang.learning;import lombok.Data;@Data
public class PrototypePatternBean implements Cloneable {public PrototypePatternBean() {System.out.println("PrototypePatternBean init");}/*** 商品编码*/private String skuCode;/*** 商品名称*/private String skuName;/*** 库存*/private int quantity;@Overrideprotected PrototypePatternBean clone(){PrototypePatternBean resume = null;try{resume = (PrototypePatternBean) super.clone();}catch (CloneNotSupportedException e){e.printStackTrace();}return resume;}
}

接下来,我们写个测试类,测试一下这2种方式创建对象的效率。

package com.yangcq.learning.hantang.learning;import lombok.extern.slf4j.Slf4j;import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;@Slf4j
public class PrototypePatternMain {/*** 每个批次的记录数*/private static final int BATCH_SIZE = 5000000;public static void main(String[] args) {LocalDateTime startTime = LocalDateTime.now();normalNewObject();log.info("normalNewObject 执行时间:{} 秒", (LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() -startTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()) / 1000);LocalDateTime startTime2 = LocalDateTime.now();prototypePattern();log.info("prototypePattern 执行时间:{} 秒", (LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() -startTime2.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()) / 1000);}/*** 原型模式*/private static void prototypePattern() {PrototypePatternBean prototypePatternBean = new PrototypePatternBean();List<PrototypePatternBean> normalNewObjectBeans = new ArrayList<>();for (int i = 0; i < BATCH_SIZE; i++) {PrototypePatternBean prototypePatternBeanTemp = prototypePatternBean.clone();prototypePatternBeanTemp.setSkuCode("837474893");prototypePatternBeanTemp.setSkuName("华为meta40 pro 5G版 麒麟");prototypePatternBeanTemp.setQuantity(i);normalNewObjectBeans.add(prototypePatternBeanTemp);}System.out.println(normalNewObjectBeans.size());}/*** 普通方式new对象*/private static void normalNewObject() {List<NormalNewObjectBean> normalNewObjectBeans = new ArrayList<>();for (int i = 0; i < BATCH_SIZE; i++) {NormalNewObjectBean normalNewObjectBean = new NormalNewObjectBean();normalNewObjectBean.setSkuCode("837474893");normalNewObjectBean.setSkuName("华为meta40 pro 5G版 麒麟");normalNewObjectBean.setQuantity(i);normalNewObjectBeans.add(normalNewObjectBean);}System.out.println(normalNewObjectBeans.size());}
}

运行一下,乖乖,差别还挺大。循环500万次,常规new对象方式耗时23秒,使用原型模式耗时0秒。

5000000
15:00:59.343 [main] INFO com.yangcq.learning.hantang.learning.PrototypePatternMain - normalNewObject 执行时间:23 秒
PrototypePatternBean init
5000000
15:00:59.536 [main] INFO com.yangcq.learning.hantang.learning.PrototypePatternMain - prototypePattern 执行时间:0 秒

但是我把构造函数中的控制台输出去掉以后,运行结果是这样的:

5000000
15:06:20.347 [main] INFO com.yangcq.learning.hantang.learning.PrototypePatternMain - normalNewObject 执行时间:0 秒
5000000
15:06:21.961 [main] INFO com.yangcq.learning.hantang.learning.PrototypePatternMain - prototypePattern 执行时间:1 秒

原型模式耗时反而高于常规的new对象方式。这是为什么呢?

原型模式创建对象时,不管你循环多少次,只会执行一次构造函数,也就是说,只会初始化一次。

new对象时,循环500万次,构造函数就会执行500万次。

也就是说,原型模式的好处就在于,省去了初始化的步骤,而是直接从内存中clone对象。从这里,我们也可以看出,

如果一个类的初始化流程比较复杂时,比如需要先执行父类中的模型逻辑,或者有复杂对象,需要进行数据库查询时,

那么,这时候选择原型模式,可以显著提高效率。

反之,如果只是一个简单的javabean,原型模式并没有优势。

原型模式使用手册,如何正确使用原型模式相关推荐

  1. 软件测试作业1:正确理解原型方法对软件生命周期不同阶段的支持

    作业1 1.正确理解原型方法对软件生命周期不同阶段的支持,分别给出:辅助或代替分析阶段:辅助设计阶段:代替分析与设计阶段:代替分析.设计和实现阶段:代替全部开发阶段所对应的开发活动执行时间顺序. 答: ...

  2. 设计模式之原型法(ProtoType)----对象创建型模式

    设计模式之原型法(ProtoType)----对象创建型模式 1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用性 1)当要实例化的类是在运行时刻指定时,例如,通过动 ...

  3. __proto__(隐式原型)与prototype(显式原型)

    最近了解了一下__proto__与prototype: prototype: 1.简单的说它就是一个属性且属性的值为地址,指向一个对象. 而它通常为函数的属性. 2.它主要用来共享属性和方法(常用于构 ...

  4. JavaScript原型彻底理解2---继承中的原型链

    一.继承的概念 继承是所有的面向对象的语言最重要的特征之一.大部分的oop语言的都支持两种继承:接口继承和实现继承.比如基于类的编程语言Java,对这两种继承都支持.从接口继承抽象方法 (只有方法签名 ...

  5. 的函数原型_JS基础函数、对象和原型、原型链的关系

    JS的原型.原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对 ...

  6. js原型和原型链_理解JS中的原型和原型链

    导读:JavaScript中(JS)的原型和原型链是web前端开发面试中经常被问到的问题:同时,如果我们能很好的理解JS中的原型和原型链,对于控制台输出的很多信息我们也能更好的理解,而原型链也是实现继 ...

  7. JS——构造函数、原型与实例之间的关系 及 原型链 的描述

    本文转载自:https://www.cnblogs.com/sarahwang/p/6870072.html https://blog.csdn.net/u012443286/article/deta ...

  8. ArcGIS Maritime Server 开发教程(七)Maritime Server 正确的开发模式

    ArcGIS Maritime Server 开发教程(七)Maritime Server 正确的开发模式 本章导读:前面几个章节已经非常细节的分析和测试了 Maritime Server 的相关功能 ...

  9. hrjava项目原型html_产品入门|什么是原型图设计?

    原型设计是产品设计过程中最重要的步骤之一,但是原型设计仍然让一些设计师和项目团队感到头疼. 原型几乎可以是任何东西,草图或者是完美的高保真界面. 究竟是什么原型? "原型"的最基本 ...

  10. 【Axure原型分享】移动端投票平台原型模板

    今天和大家分享移动端投票平台的原型模板 [原型预览] 用电脑点击左下方阅读原文或复制打开下面的原型预览地址 https://axhub.im/ax9/3c7b8d4914a6041d/#g=1 [原型 ...

最新文章

  1. Shell多线程操作及线程数控制实例
  2. [nRF51822] 3、 新年也来个总结——图解nRF51 SDK中的Button handling library和FIFO library...
  3. 开篇-----勉励篇
  4. harmonyos2.0测评,爆料:荣耀30 Pro开始测试华为鸿蒙HarmonyOS 2.0
  5. java 火星坐标转wgs84_js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
  6. python 面向对象_Python 和 Java 基础对比 08 —— 面向对象
  7. 使用计算机音箱进行音乐播放的过程,插卡音箱音乐播放顺序调整及歌单式1
  8. 使用c语言生成斐波拉契(Fibonacci)数列的前20项并输出
  9. cfe刷机教程 斐讯k3_小白专属------K3官方固件CFE刷LEDE教程
  10. 古体字与简体字对照表_王力_简体字与繁体字对照表
  11. 爬虫-python(三) 百度搜索关键词后爬取搜索结果
  12. 详解 JavaScript 的发展史
  13. SwiftUI学习笔记之@State, @Binding
  14. Driver/library version mismatch
  15. java电话面试_记一次java电话面试
  16. RK3399平台开发系列讲解(IIO子系统)4.42、IIO子系统数据结构
  17. 靶机渗透练习78-Thoth Tech
  18. 图解网络设备的配置与应用
  19. 安全运营 splunk入门
  20. Meter Bus解析1:概述

热门文章

  1. java泡妞代码_java泡妞小程序
  2. 华为p20Pro投屏电脑 手机投屏电脑教程
  3. 配置管理——配置管理委员会
  4. 如何裁剪图片中不要的部分?这个裁剪方法很好用
  5. kermit的安装、配置、使用 .
  6. Python Selenium 字节校招实习岗筛选
  7. 南京金融python培训班
  8. input搜索框 php,html搜索框怎么设置?html搜索框input标签的使用方法实例
  9. 地球经纬度计算两点距离
  10. 遥感的几何校正、正射校正、辐射校正