当前位置: 移动技术网 > IT编程>开发语言>Java > java架构师升级之路之设计模式(原型模式)

java架构师升级之路之设计模式(原型模式)

2020年07月17日  | 移动技术网IT编程  | 我要评论

在这里插入图片描述

场景介绍:
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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网