设计模式-原型模式(Prototype)

举报
AAAI 发表于 2021/05/07 23:53:08 2021/05/07
【摘要】 原型模式(Prototype) JS原型,克隆,对象hashcode不同,但内容相同 例子:Prototype,Cloneable接口,clone()方法,native[Native Method(原生方法)] 浅克隆 视频原型 public class Video implements Cloneable{ private String name; priv...

原型模式(Prototype)

JS原型,克隆,对象hashcode不同,但内容相同

例子:Prototype,Cloneable接口,clone()方法,native[Native Method(原生方法)]

浅克隆

视频原型

public class Video implements Cloneable{ private String name; private Date createTime; @Override protected Object clone() throws CloneNotSupportedException{ return super.clone(); }// 接口方法 public Video(){}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

原型对象

Video v1 = new Video();

  
 
  • 1

复制原型的新对象

Video v2 = v1.clone();

  
 
  • 1

比较

v1.equals(v2); // 一样
v1.hashcode == v2.hashcode;  // 不一样

  
 
  • 1
  • 2

问题:当复制之后,改变原型的数据,复制的新对象数据也会改变,表示这两个对象指向同一个对象的内存地址。

在这里插入图片描述

浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。

深克隆

深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

将浅拷贝中的cloneable接口方法重新实现。

 @Override protected Object clone() throws CloneNotSupportedException{ Object obj = super.clone(); // v和obj都是引用,都指向堆中的同一个对象,基于类的访问权限。 Video v = (Video)obj; // 将原型对象的属性也克隆 v.createTime = (Date)this.createTime.clone(); // 属性是对象对象还继续引用其他的对象 return obj; }// 接口方法

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

应用

Spring Bean:单例模式,原型模式

原型模式+工厂模式:将new替代为原型模型,每次直接复制为一个新对象。

  • 对象之间相同或相似,即只是个别的几个属性不同的时候。
  • 创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。
  • 创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
  • 系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值。
  • 在 Spring 中,原型模式应用的非常广泛,例如 scope=‘prototype’、JSON.parseObject() 等都是原型模式的具体应用。

文章来源: blog.csdn.net,作者:αβγθ,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_38022166/article/details/116496186

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。