• 5 原型模式(Prototype)


    原型模式是创建型的模式,思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。在Java中,复制对象是通过clone()实现的,先创建一个原型类

     
    1. /**
       * 原型类
       * 
       * @author liubo
       */
      public class Prototype implements Cloneable {
          @Override
          protected Object clone() throws CloneNotSupportedException {
              Prototype proto = (Prototype) super.clone();
              return proto;
          }
      }
    一个原型类,只需要实现Cloneable接口,覆写clone方法,此处clone方法可以改成任意的名称,因为Cloneable接口是个空接口,你可以任意定义实现类的方法名,如cloneA或者cloneB,因为此处的重点是super.clone()这句话,super.clone()调用的是Object的clone()方法,而在Object类中,clone()是native的
     

    浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

    深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。


    1. /**
       * 完整的原型模式,浅复制,深复制
       */
      package com.liubo.patterns.prototype;
      import java.io.ByteArrayInputStream;
      import java.io.ByteArrayOutputStream;
      import java.io.IOException;
      import java.io.ObjectInputStream;
      import java.io.ObjectOutputStream;
      import java.io.Serializable;
      /**
       * 原型类
       * 
       * @author liubo
       */
      public class Prototype implements Cloneable, Serializable {
          private String string;
          private SerializableObject obj;
          /* 浅复制 */
          @Override
          protected 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;
          }
      }

    要实现深复制,需要采用流的形式读入当前对象的二进制输入,再写出二进制数据对应的对象。





  • 相关阅读:
    html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
    HTMl5的存储方式sessionStorage和localStorage详解
    浏览器文档模式设置
    页面缓存
    SQL Server死锁总结
    读写分离,读写分离死锁解决方案,事务发布死锁解决方案,发布订阅死锁解决方案
    页面缓存
    HTML5 history API,创造更好的浏览体验
    【转】编写高质量代码改善C#程序的157个建议——建议96:成员应优先考虑公开基类型或接口
    【转】编写高质量代码改善C#程序的157个建议——建议95:避免在构造方法中调用虚成员
  • 原文地址:https://www.cnblogs.com/liubo6/p/4517182.html
Copyright © 2020-2023  润新知