欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-15 23:39:57
场景介绍:DTO、VO、POJO、EntityDTO和VO之间存在一些属性名称、类型都相同。数据库中表查询出来的对象会赋值给DTO,但是并不会直接传给MVC中的model,而是把DTO中的值会传给VO,再把VO中的值传到view中。复制,就是把DTO中的每一个属性值赋值给VO中的每一个属性值。属性名称相同、属性类型相同Apache 反射区实现(原型模式),因为反射效率相对较低,那么我们采用clone()技术去实现。clone()......

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

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