zoukankan      html  css  js  c++  java
  • 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;
          }
      }

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





  • 相关阅读:
    P2043 质因子分解
    CODE[VS] 3164 质因数分解
    借过
    CODE[VS] 1165 字符串的展开 || P1098 字符串的展开
    CODE[VS] 1144 守望者的逃离 || P1095 守望者的逃离
    CODE[VS] 2914 吹空调
    AC日记
    AC日记
    山科日记—回文
    山科日记—编写函数myFloor和myCeil(编程题)
  • 原文地址:https://www.cnblogs.com/liubo6/p/4517182.html
Copyright © 2011-2022 走看看