java架构师升级之路之设计模式(原型模式)
程序员文章站
2022-04-15 23:39:57
场景介绍:DTO、VO、POJO、EntityDTO和VO之间存在一些属性名称、类型都相同。数据库中表查询出来的对象会赋值给DTO,但是并不会直接传给MVC中的model,而是把DTO中的值会传给VO,再把VO中的值传到view中。复制,就是把DTO中的每一个属性值赋值给VO中的每一个属性值。属性名称相同、属性类型相同Apache 反射区实现(原型模式),因为反射效率相对较低,那么我们采用clone()技术去实现。clone()......
场景介绍:
DTO、VO、POJO、Entity
DTO和VO之间存在一些属性名称、类型都相同。
数据库中表查询出来的对象会赋值给DTO,但是并不会直接传给MVC中的model,而是把DTO中的值会传给VO,再把VO中的值传到view中。
复制,就是把DTO中的每一个属性值赋值给VO 中的每一个属性值。属性名称相同、属性类型相同
Apache 反射区实现(原型模式),因为反射效率相对较低,那么我们采用clone()技术去实现。
clone()出新对象要求引用地址不能相同,属性、属性类型必须相同。(原型模式特点)
Spring中,如定义:scope=“prototype” ,就是把对象中配置的依赖关系,在每次使用对象之前,都会创建一个新的对象,并且会把依赖关系完整的赋值给新的对象。
案例:
package com.jidongcloud.test.deep;
import java.util.Date;
/**
* ClassName:Monkey
* PackageName:com.jidongcloud.test.deep
* Description:
*
* @date:2020/7/14 22:11
* @author:robin
*/
public class Monkey {
public int height;
public int weight;
public Date birthDay;
}
package com.jidongcloud.test.deep;
import java.io.*;
import java.util.Date;
/**
* ClassName:Qitiandasheng
* PackageName:com.jidongcloud.test.deep
* Description:
*
* @date:2020/7/14 22:13
* @author:13812536906
*/
public class Qitiandasheng extends Monkey implements Cloneable,Serializable{
/**
* 达到每个猴子都有一个独立的金箍棒
*/
public JinGuBang jinGuBang;
public Qitiandasheng(){
this.birthDay=new Date();
// this.jinGuBang=new JinGuBang();
}
@Override
protected Object clone() throws CloneNotSupportedException {
return deepClone();
}
public Object deepClone(){
try {
//我们不使用反射,我们使用序列化进行操作
//FileOutputStream需要传一个参数,ByteArrayOutputStream不需要传参数
//序列化----------写文件
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
//this就是 Qitiandasheng 对象
oos.writeObject(this);
//反序列化 -------读取文件
ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bis);
Qitiandasheng copyQTDS = (Qitiandasheng)ois.readObject();
copyQTDS.birthDay=new Date();
return copyQTDS;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
package com.jidongcloud.test.deep;
import java.io.Serializable;
/**
* ClassName:JinGuBang
* PackageName:com.jidongcloud.test.deep
* Description:
*
* @date:2020/7/14 22:16
* @author:robin
*/
public class JinGuBang implements Serializable {
public float h=100; //高度
public float d=10; //宽度
public Float big(){
this.d *=2;
this.h *=2;
return d;
}
public void small(){
this.d /=2;
this.h /=2;
}
}
package com.jidongcloud.test.deep;
/**
* ClassName:TestMain
* PackageName:com.jidongcloud.test.deep
* Description:
*
* @date:2020/7/14 22:21
* @author:robin
*/
public class TestMain {
public static void main(String[] args) {
Qitiandasheng qitiandasheng= new Qitiandasheng();
qitiandasheng.jinGuBang=new JinGuBang();
System.out.println(qitiandasheng.jinGuBang.big());
Qitiandasheng cloneQitiandasheng = null;
try {
cloneQitiandasheng = (Qitiandasheng)qitiandasheng.deepClone();
System.out.println(cloneQitiandasheng.jinGuBang.big());
/**
* com.jidongcloud.test.deep.JinGuBang@7adf9f5f
* com.jidongcloud.test.deep.JinGuBang@7adf9f5f
* 如何解决上述浅复制,
* 我们采用深复制
*/
/**我们仅仅加了一个 deepClone()方法 ,在 Qitiandasheng 类中,输出结果如下:
* com.jidongcloud.test.deep.JinGuBang@7adf9f5f
* com.jidongcloud.test.deep.JinGuBang@3f91beef
*/
} catch ( Exception e) {
e.printStackTrace();
}
}
}
本文地址:https://blog.csdn.net/qq_30347133/article/details/107346987
上一篇: 荐 Java入门——常用API(2)
下一篇: RabbitMQ-Fanout案例