zoukankan      html  css  js  c++  java
  • java实现23种设计模式之原型模式

    在Java中,复制对象是通过clone()实现的,先创建一个原型类:

    package com.ceshi4;
    
    public class Prototype implements Cloneable{
    
        public Object clone() throws CloneNotSupportedException{
            Prototype prototype = (Prototype) super.clone();
            return prototype;
        }
    }
    很简单,一个原型类,只需要实现Cloneable接口,覆写clone方法。
    此处clone方法可以改成任意的名称,因为Cloneable接口是个空接口,你可以任意定义实现类的方法名,如cloneA或者cloneB,因为此处的重点是super.clone()。
    super.clone()调用的是Object的clone()方法,而在Object类中,clone()是native的。
    使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。
    结合对象的浅复制和深复制来说一下,首先需要了解对象深、浅复制的概念:
    浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
    深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
    此处,写一个深浅复制的例子:
    package com.ceshi4;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    public class Prototype implements Cloneable, Serializable {
    
        private static final long serialVersionUID = 1L;
        private String string;
    
        private SerializableObject obj;
    
        /* 浅复制 */
        public Object clone() throws CloneNotSupportedException {
            Prototype proto = (Prototype) super.clone();
            return proto;
        }
    
        /* 深复制 */
        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);
            return ois.readObject();
        }
    
        public String getString() {
            return string;
        }
    
        public void setString(String string) {
            this.string = string;
        }
    
        public SerializableObject getObj() {
            return obj;
        }
    
        public void setObj(SerializableObject obj) {
            this.obj = obj;
        }
    
    }
    
    class SerializableObject implements Serializable {
        private static final long serialVersionUID = 1L;
    }
  • 相关阅读:
    js验证身份证号,超准确
    C#对象序列化与反序列化
    寒冰王座[HDU1248]
    A C[HDU1570]
    循环多少次?[HDU1799]
    Play on Words[HDU1116]
    Fengshui-[SZU_B40]
    Travel Problem[SZU_K28]
    Big Event in HDU[HDU1171]
    Count the Trees[HDU1131]
  • 原文地址:https://www.cnblogs.com/zhengyuanyuan/p/10737693.html
Copyright © 2011-2022 走看看