• Prototype原型模式


    原型模式就是以一个对象作为原型构建另一个对象,也就是我们说的克隆。

    克隆做法是什么呢?

      对象实现克隆接口Clonable接口,将访问方法clone重写,访问权限变大。

    默认的克隆是浅拷贝,指的是外层对象是new的,但是对象的属性都是通过值copy给的的,也就会出现一个问题,引用数据类型用的都是同一个对象

    深拷贝的做法:

       重写clone方法,针对每一个引用数据类型new 一个对象,只是将基本数据类型的值放入进去该对象

      或者可以利用序列化做媒介完成,深拷贝。

    代码:

    package com.zhen.build_template.prototype;
    
    import java.io.*;
    
    /**
     * @author zhen
     * @Date 2019/5/28 21:48
     */
    public class Prototype implements Cloneable, Serializable{
        public String name = "嘻嘻";
        public C c = new C("张三", 2);
        @Override
        public Object clone() throws CloneNotSupportedException {
            Prototype prototype =  (Prototype) super.clone();
            return prototype;
        }
    
        public Object deepClone() throws IOException, ClassNotFoundException {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);
    
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            Object obj = ois.readObject();
            return obj;
    
        }
    
        public Object deepClone1()  throws CloneNotSupportedException{
            Prototype object = (Prototype) super.clone();
            object.c = new C(this.c.name, this.c.age);
            return object;
        }
    
    }
    
    class C implements Serializable{
        public String name;
        public int age;
        public C(String name, int age){
            this.age = age;
            this.name = name;
        }
    }
    
    
    package com.zhen.build_template.prototype;
    
    /**
     * @author zhen
     * @Date 2019/5/28 21:50
     */
    public class TestClone {
        public static void main(String[] args) throws Exception{
            Prototype prototype = new Prototype();
            Prototype prototype1 = (Prototype) prototype.clone();
            System.out.println(prototype.equals(prototype1));
            System.out.println(prototype.name.equals(prototype1.name));
            System.out.println(prototype.c.equals(prototype1.c));
    
            Prototype prototype2 = (Prototype) prototype.deepClone();
            System.out.println(prototype.equals(prototype2));
            System.out.println(prototype.name==prototype2.name);
            System.out.println(prototype.c.equals(prototype2.c));
            System.out.println(prototype.c.name==prototype2.c.name);
        }
    }
    View Code
  • 相关阅读:
    xml转换为json格式时,如何将指定节点转换成数组 Json.NET
    快速删除C#代码中的空白行
    C#编程中的Image/Bitmap与base64的转换及 Base-64 字符数组或字符串的长度无效问题 解决
    Flash设置(各种版本浏览器包括低版本IE)
    使用vcastr22.swf做flash版网页视频播放器
    使用VLC Activex插件做网页版视频播放器
    web项目 在visual studio 输出窗口显示调试信息
    geos 3.6.3库windows版本 已编译完成的32位版本和64位版本
    vs2017 打开附带的localdb v13
    visual studio code 里调试运行 Python代码
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/10942760.html
Copyright © 2020-2023  润新知