当前位置: 首页 > news >正文

模式代码 java中aes_建造者模式和原型模式在开源代码中的应用

建造者模式

将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。

JDK 中 java.lang.StringBuilder 和 java.lang.StringBuffer 两个对字符串操作的类使用了建造者模式。类中的 append、delete、replace、insert、deleteCharAt、appendCodePoint 方法,通过传入字符或字符串相关的参数,return this 构造对象。

public StringBuilder append(String str) {    super.append(str);    return this;}public StringBuilder appendCodePoint(int codePoint) {    super.appendCodePoint(codePoint);    return this;}public StringBuilder delete(int start, int end) {    super.delete(start, end);    return this;}public StringBuilder deleteCharAt(int index) {    super.deleteCharAt(index);    return this;}public StringBuilder replace(int start, int end, String str) {    super.replace(start, end, str);    return this;}public StringBuilder insert(int index, char[] str, int offset, int len){    super.insert(index, str, offset, len);    return this;}

原型模式

将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新对象。在 JDK 中所有类的默认父类 java.lang.Object 中的 clone 方法,就实现快速地浅拷贝一个对象,当然有个前提条件,就是被克隆的对象的类需要实现 Cloneable 接口,否则会抛出异常 CloneNotSupportedException。
/** * Creates and returns a copy of this object.  The precise meaning * of "copy" may depend on the class of the object. */protected native Object clone() throws CloneNotSupportedException;

Java 默认的 clone 方法是浅拷贝,那如何实现深拷贝呢?

  • 实现 Cloneable 接口,递归 clone 引用对象或 new 新对象(类的属性字段未实现 Cloneable 接口)

  • 借助序列化完成深拷贝,如实现 JDK java.io.Serializable 接口、json格式序列化、xml格式序列化等

在我们平时开发中,也会使用 Spring 中 org.springframework.beans.BeanUtils 的 copyProperties 方法复制一个对象的属性到另一个对象

public static void copyProperties(Object source, Object target) throws BeansException {    copyProperties(source, target, null, (String[]) null);}

apache commons-beanutils 包中 org.apache.commons.beanutils.BeanUtils 工具类中有 cloneBean 方法无需实现 Cloneable 接口的浅拷贝,也有 copyProperties 和 copyPropertie 方法复制对象属性和指定属性进行复制。

/** * 

Clone a bean based on the available property getters and setters,

* even if the bean class itself does not implement Cloneable. * * * Note: this method creates a shallow clone. * In other words, any objects referred to by the bean are shared with the clone * rather than being cloned in turn. * */ public Object cloneBean(Object bean) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException { if (log.isDebugEnabled()) { log.debug("Cloning bean: " + bean.getClass().getName()); } Object newBean = null; if (bean instanceof DynaBean) { newBean = ((DynaBean) bean).getDynaClass().newInstance(); } else { newBean = bean.getClass().newInstance(); } getPropertyUtils().copyProperties(newBean, bean);    return (newBean);}

b166e0cd05077020f360b33b52baa668.png

相关文章:

  • form表ge实例 html_从零开始学Vue(二~三)—— Vue 实例 / 模板语法(插值、指令)...
  • python 图像宽度_在python中创建具有一定宽度边框的图像
  • print输出 pytorch_60题PyTorch简易入门指南,做技术的弄潮儿??
  • 如何使用conda安装的nvcc_防爆配电箱如何安装、使用?
  • c语言两个for语句并列执行_5.8 C语言for循环
  • mmsi是代表船舶什么_船舶检查过程中, 会遇到哪些问题? 如何解决?
  • 金税盘显示frm000013_征期提醒 金税盘、税控盘常见那些事
  • 如何给按钮添加背景图片_如何在 Ubuntu 18.04 的右键单击菜单中添加“新建文档”按钮...
  • 印象笔记三级目录_印象笔记使用技巧-第一篇(面向新手)
  • 气象ts评分_基于评分最优化的模式降水预报订正算法对比-中国气象科学研究院.pdf...
  • invalid signature什么意思_讨论记录用随机森林对生存数据降维,筛选signature
  • 扩展 php_memcached的PHP扩展安装使用
  • 人均劳动生产率的计算方法_劳动生产率是怎么计算的
  • 分子动力学aimd_CP2K教程系列之第一性原理分子动力学(Pymatflow篇)
  • 安装mysql 创建用户_mysql安装步骤及用户创建
  • 【知识碎片】第三方登录弹窗效果
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • cookie和session
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • React系列之 Redux 架构模式
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • 编写符合Python风格的对象
  • 给Prometheus造假数据的方法
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何优雅地使用 Sublime Text
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #vue3 实现前端下载excel文件模板功能
  • (1)bark-ml
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (转)jdk与jre的区别
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET和.COM和.CN域名区别
  • .NET命令行(CLI)常用命令
  • .NET企业级应用架构设计系列之开场白
  • .NET实现之(自动更新)
  • .net中调用windows performance记录性能信息
  • .net专家(高海东的专栏)
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @Bean有哪些属性
  • @Resource和@Autowired的区别
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [AAuto]给百宝箱增加娱乐功能
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [Android]使用Git将项目提交到GitHub
  • [BJDCTF2020]The mystery of ip1
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [C++参考]拷贝构造函数的参数必须是引用类型
  • [CQOI 2011]动态逆序对